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)
'__acl__' peut aussi être dynamique. Voici un exemple: http://websauna.org/docs/narrative/crud/standalone.html?highlight=contract#creating-crud-resources –