2012-08-04 14 views
9

autenticación y la autorización se pueden integrar en el frasco a través de la matraz de Login y matraz de Principales plugins. (O también, potencialmente, a través del plug-in matraz de Seguridad.)matraz de administración + (matraz de inicio de sesión y/o matraz de Principal)

Sin embargo: matraz de administración complemento --another que proporciona un panel de fondo - no es un modelo registrado ... y, creo (de tal manera que yo se puede decir), los decoradores utilizados por Flask-Login y Flask-Principal, y que de otro modo son necesarios para que un usuario acceda a una vista renderizada ... esos decoradores solo operan en vistas que son parte de un plano registrado.

dos preguntas:

1) ¿Cómo registro matraz de administración como modelo en mi aplicación, y/o active matraz de inicio de sesión y/o decoradores Frasco-Principales para proteger las vistas asociadas con el frasco-admin ?

2) ¿Por qué Flask-Login y Flask-Principal funcionan solo en objetos que son "nativamente" parte de mi aplicación ... y no objetos (por ejemplo, objeto "Admin") importados de un complemento? ¿Cómo puedo solucionar este problema ... si realmente lo estoy percibiendo correctamente?

Debo entender que este es el problema, ya que no me cuesta nada crear vistas protegidas para la página de índice principal de mi aplicación ... o cualquier otra página con una vista ubicada dentro de un plano. Simplemente no puedo hacerlo para la página de índice Flask-Admin (que, una vez más, no tiene ningún modelo).

Respuesta

11

matraz de administración proporciona otra manera de proporcionar la autenticación - simplemente subclase el AdminIndex y BaseIndex vistas (o vistas desde contrib si sólo necesita esos) y poner en práctica el método is_accessible. Ver the documentation para más detalles. También hay an example en el repositorio.

+0

Gracias, Sean ... para mí girando en la documentación de éste. Los revisé e intenté implementarlos ... aunque fue en vano. El uso del método is_accessible hace innecesario el uso de Flask-Login para proteger el panel de administración. Significado: ¿entonces no necesito un decorador de Inicio de sesión de Flask para la def de cualquier vista de Flask-Admin? Debo decir, fuera del repositorio, que los documentos son delgados para auth con Flask-Admin. Si, por casualidad, más allá del repositorio anterior, te encuentras con otra implementación pública de esa solución ... me encantaría saber al respecto. – Sean

+1

@Sean: no necesita el decorador * de inicio de sesión de Flask, pero deberá usar los métodos de inicio de sesión de Flask para autenticar al usuario. Si nos fijamos en [línea 85] (https://github.com/mrjoes/flask-admin/blob/master/examples/auth/auth.py#L85) y más allá del ejemplo, verá que las vistas de administrador solo son accesibles si el usuario actual está autenticado. Si un usuario no autenticado intenta acceder a las vistas administrativas, debe redirigirse a la pantalla de inicio de sesión. –

+0

El enlace a un ejemplo era exactamente lo que necesitaba, gracias. – iurii

4

Ejemplo simple como usar matraz de administración con el frasco-director

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

La devolución de un redireccionamiento en 'is_accessible' se evalúa como Verdadero. Eso definitivamente no es lo que quieres! – Javier

Cuestiones relacionadas