答案 0 :(得分:1)
自从我参与上一个Pyramid项目以来已经有一段时间了,但我确实有一个基本的ACL设置,其中包含一个保护我的视图的数据库后端。希望这可能会有所帮助?我很确定我在Pyramid security docs和authorization中摸索着让我的工作变得有效。
我的RootFactory
课程中有我的ACL定义:
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
然后在我的观点中,我会给他们一个权限:
@view_config(route_name='useredit', renderer='useredit.mako', permission='siteadmin')
我的groupfinder
返回了当前用户所属的角色:
def groupfinder(userid, request):
user = DBSession.query(User).filter(User.id == userid).first()
return [g.name for g in user.roles]
角色只是我添加到User类对象的关系表,以便于访问。一切都使用SQLAlchemy作为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)