数据库在Pyramid中建模基于角色的安全性

时间:2016-09-29 14:57:29

标签: pyramid

我想实现基于角色的安全性(RBAC)

用户 - >角色 - >权限的

存储在附加的ERD数据库中。

如何实际将特权(通过SQL读入)转换为ACL的实际权限以保护资源

enter image description here

1 个答案:

答案 0 :(得分:1)

自从我参与上一个Pyramid项目以来已经有一段时间了,但我确实有一个基本的ACL设置,其中包含一个保护我的视图的数据库后端。希望这可能会有所帮助?我很确定我在Pyramid security docsauthorization中摸索着让我的工作变得有效。

我的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)