2016-09-29 1 views

Répondre

1

Cela fait quelque temps que je travaille sur mon dernier projet Pyramide, mais j'ai eu une configuration ACL de base avec un back-end de base de données qui protégeait mes vues. Espérons que cela pourrait aider? Je suis à peu près sûr que j'ai fouillé mon chemin à travers les Pyramid security docs et authorization pour que quelque chose fonctionne.

j'avais dans ma RootFactory classe une définition de mes ACLs:

class RootFactory(object): 
    ''' ACLs are set up in a cumulative manner 

     On a given view, set the permission to the minimum level of access that can request that object. 
     Given the ACLs, a user set in one level should have access to all levels below, too. 
    ''' 
    __acl__ = [ 
     (Allow, Everyone, 'view'), 
     (Allow, Authenticated, 'edit'), 
     (Allow, 'reportviewer', ('reportviewer')), 
     (Allow, 'clientuser', ('reportviewer', 'clientuser')), 
     (Allow, 'clientadmin', ('reportviewer', 'clientuser', 'clientadmin')), 
     (Allow, 'trialuser', ('reportviewer', 'clientuser', 'clientadmin')), 
     (Allow, 'siteuser', ('reportviewer', 'clientuser', 'clientadmin', 'siteuser')), 
     (Allow, 'siteadmin', ('reportviewer', 'clientuser', 'clientadmin', 'siteuser', 'siteadmin')) 
    ] 

    def __init__(self, request): 
     pass 

Puis sur mon point de vue que je donnerais leur attribuer une autorisation:

@view_config(route_name='useredit', renderer='useredit.mako', permission='siteadmin') 

Mon groupfinder retourné les rôles que le courant utilisateur appartenait à:

def groupfinder(userid, request): 
    user = DBSession.query(User).filter(User.id == userid).first() 
    return [g.name for g in user.roles] 

Les rôles étaient juste une relation tableau que j'ai ajouté à mon objet de classe Utilisateur pour un accès plus facile. Tout utilisait SQLAlchemy comme ORM.

UserRole = Table('roles_users', Base.metadata, 
        Column('user_id', Integer, ForeignKey("users.id"), 
         primary_key=True), 
        Column('role_id', Integer, ForeignKey("roles.id"), 
         primary_key=True)) 

class User(Base): 
    __tablename__ = 'users' 
    id = Column(Integer, primary_key=True) 
    email = Column(Text, unique=True) 
    displayname = Column(Text) 

    roles = relationship("Role", secondary=UserRole) 
+1

'__acl__' peut aussi être dynamique. Voici un exemple: http://websauna.org/docs/narrative/crud/standalone.html?highlight=contract#creating-crud-resources –