2012-08-04 14 views
9

Uwierzytelnianie i autoryzacja może być zintegrowany Kolby poprzez Kolby Login i Kolba-Principal wtyczek. (Lub też potencjalnie poprzez wtyczki Kolba-Security).Kolba-Admin + (kolba Login i/lub Kolba-Principal)

Jednakże: Kolba-Admin --another plugin który zapewnia pulpit backend - nie jest zarejestrowanym plan ... i wierzę (o tyle jako I można powiedzieć), dekoratory używane przez Flask-Login i Flask-Principal - i które w przeciwnym razie są wymagane, aby użytkownik mógł uzyskać dostęp do renderowanego widoku ... te dekoratory działają tylko na widokach, które są częścią zarejestrowanego projektu.

dwa pytania:

1) W jaki sposób mogę zarejestrować skrzynkowego Administrator jako plan w mojej aplikacji i/lub w inny sposób umożliwiać skrzynkowego login i/lub Kolba-Principal dekoratorów aby chronić widoki związane z kolbą-admin ?

2) Dlaczego Flask-Login i Flask-Principal działają tylko na obiektach, które są "natywnie" częścią mojej aplikacji ... a nie obiektów (np. Obiektu "Admin"), które są importowane z wtyczki? Jak mogę obejść ten problem ... jeśli rzeczywiście postrzegam go poprawnie?

Podejrzewam, że to jest problem, ponieważ nie jest dla mnie przykro mi tworzyć zabezpieczonych widoków na głównej stronie mojej aplikacji ... ani żadnej innej strony z widokiem umieszczonym wewnątrz planu. Po prostu nie mogę tego zrobić na stronie indeksu Flask-Admin (która znowu nie ma żadnego planu).

Odpowiedz

11

Kolba-Administrator zapewnia inny sposób uwierzytelnianie - po prostu podklasy AdminIndex i BaseIndex widoki (lub widoki z contrib jeśli trzeba tylko tych) i wdrożenie metody is_accessible. Aby uzyskać więcej informacji, patrz the documentation. W repozytorium znajduje się również an example.

+0

Dzięki, Sean ... do toczenia mnie na docs dla tego jednego. Sprawdziłem je i próbowałem je wdrożyć ... ale bezskutecznie. Zastosowanie metody is_accessible sprawia, że ​​używanie Flask-Login jest zbędne, aby chronić panel administracyjny? Czyli: nie potrzebuję dekoratora Flask-Login do defa dowolnego widoku Flask-Admin? Muszę powiedzieć, że poza repo dokumentacja jest cienka dla auth z Flask-Admin. Jeśli przez przypadek, poza powyższym repozytorium, natkniesz się na inną publiczną implementację tego rozwiązania ... chciałbyś o tym wiedzieć. – Sean

+1

@Sean - nie potrzebujesz dekoratora Flask-Login *, ale musisz użyć metod Flask-Login, aby uwierzytelnić użytkownika. Jeśli spojrzysz na [wiersz 85] (https://github.com/mrjoes/flask-admin/blob/master/examples/auth/auth.py#L85) i poza tym przykładem, zobaczysz, że widoki administratora są dostępne tylko wtedy, gdy bieżący użytkownik jest uwierzytelniony. Jeśli nieuwierzytelniony użytkownik spróbuje uzyskać dostęp do widoków admina, powinien zostać przekierowany do ekranu logowania. –

+0

Link do przykładu był dokładnie tym, czego potrzebowałem, dziękuję. – iurii

4

Prosty przykład jak używać skrzynkowego Administrator z kolbą-Principal

from functools import partial 
from flask.ext.admin import Admin as BaseAdmin, AdminIndexView 
from flask.ext.principal import Permission, identity_loaded, Need 
from flask.ext.security import current_user 

PartnerAccessNeed = partial(Need, 'access') 

class PartnerAccessPermission(Permission): 
    def __init__(self, partner_id): 
     need = PartnerAccessNeed(partner_id) 
     super(PartnerAccessPermission, self).__init__(need) 


@identity_loaded.connect 
def on_post_identity_loaded(sender, identity): 
    if hasattr(current_user, 'partner'): 
     identity.provides.add(PartnerAccessNeed(current_user.partner.id)) 

class PartnerAdminIndexView(AdminIndexView): 

    def __init__(self, partner_id, *args, **kwargs): 
     self.partner_id = partner_id 
     super(PartnerAdminIndexView, self).__init__(*args, **kwargs) 

    def is_accessible(self): 

     if current_user.is_anonymous(): 
      return redirect(url_for_security('login')) 

     if not current_user.is_partner(): 
      return False 

     permission = PartnerAccessPermission(self.partner_id) 

     if permission.can():  
      return True 

     return False 

class PartnerAdmin(BaseAdmin): 
    def __init__(self, partner_id, endpoint, name, subdomain, *args, **kwargs): 

     index = PartnerAdminIndexView(name=name, 
             endpoint=endpoint, 
             url='/dashboard', 
             partner_id=partner_id) 

     super(PartnerAdmin, self).__init__(base_template='mcnm/master.html', index_view=index, subdomain=subdomain) 
+1

Zwracanie przekierowania w 'is_accessible' jest obliczane jako True. To zdecydowanie nie jest to, czego chcesz! – Javier