2011-04-15 14 views
5

Tengo un proyecto de pirámide utilizando la interfaz de administración de formalchemy. Agregué la autenticación ACL básica y el complemento pyramid_formalchemy siempre se niega aunque esté autenticado.Pyramid y FormAlchemy interfaz de administración

¿Alguna idea de cómo solo permite a los usuarios autenticados usar la interfaz de administración pyramid_formalchemy?

La política de autorización fue añadir la siguiente manera:

 
authn_policy = AuthTktAuthenticationPolicy('MYhiddenSECRET', callback=groupfinder) 
authz_policy = ACLAuthorizationPolicy() 

config = Configurator(
    settings=settings, 
    root_factory='package.auth.RootFactory', 
    authentication_policy=authn_policy, 
    authorization_policy=authz_policy 
) 

# pyramid_formalchemy's configuration 
config.include('pyramid_formalchemy') 
config.include('fa.jquery') 
config.formalchemy_admin('admin', package='package', view='fa.jquery.pyramid.ModelView') 

Respuesta

11

pyramid_formalchemy utiliza los permisos 'view', 'edit', 'delete', 'new' para determinar quién puede hacer qué. El __acl__ se propaga desde su objeto de modelo SQLAlchemy. Por lo tanto, debe colocar un __acl__ en cada uno de sus objetos modelo, lo que le permite a los grupos deseados acceder a esos permisos. Por ejemplo, desde el pyramid_formalchemypyramidapp ejemplo de proyecto:

class Bar(Base): 
    __tablename__ = 'bar' 
    __acl__ = [ 
      (Allow, 'admin', ALL_PERMISSIONS), 
      (Allow, 'bar_manager', ('view', 'new', 'edit', 'delete')), 
     ] 
    id = Column(Integer, primary_key=True) 
    foo = Column(Unicode(255)) 

Por supuesto, si no se proporciona un __acl__ entonces se verá en el linaje del árbol de recursos hasta que llegue al factory. Por defecto, pyramid_formalchemy define su propia fábrica pyramid_formalchemy.resources.Models, sin embargo, puede subclase esto y proporcionar una __acl__ a ella, como global para todos sus modelos:

from pyramid_formalchemy.resources import Models 

class ModelsWithACL(Models): 
    """A factory to override the default security setting""" 
    __acl__ = [ 
      (Allow, 'admin', ALL_PERMISSIONS), 
      (Allow, Authenticated, 'view'), 
      (Allow, 'editor', 'edit'), 
      (Allow, 'manager', ('new', 'edit', 'delete')), 
     ] 

config.formalchemy_admin('admin', package='package', view=..., factory=ModelsWithACL) 
+0

gran respuesta y gran explicación. ¡Gracias! –

Cuestiones relacionadas