如何查询用户在flask和sqlalchemy中拥有的所有权限

时间:2020-08-23 07:33:34

标签: python sqlalchemy flask-sqlalchemy

我很困惑如何获取用户拥有的所有权限。 我有以下4个模型。(用户,角色,role_permission(作为关联表),权限)

class User(db.Model , UserMixin):
    __tablename__ = 'user'
    id = db.Column(db.Integer, primary_key=True , autoincrement=True)
    name = db.Column(db.String(60), nullable=False)
    role_id = db.Column(db.Integer, db.ForeignKey('role.id') , nullable = False )
    
    def __repr__(self):
        return f"User('{self.name}',{self.email}', '{self.company}' , '{self.country}' , '{self.password}' , '{self.role_id}')"

class Role(db.Model):
    __tablename__ = 'role'
    user = db.relationship('User' ,uselist=False)

    id = db.Column(db.Integer, primary_key=True ,autoincrement=True)
    role_name = db.Column(db.String(100), nullable=False , unique=True)

    _add_permission = db.relationship('Permission' , secondary=lambda:role_permission , backref= db.backref('permission', lazy = 'dynamic') , lazy = 'dynamic' )
    
    def __repr__(self):
        return f"ROle('{self.id}',{self.role_name}')"

role_permission = db.Table('Role_Permission', 
    db.Column('id',db.Integer, primary_key=True , autoincrement=True),
    db.Column('roleName' , db.Integer, db.ForeignKey('role.id') , nullable = False),
    db.Column('permissionName' , db.Integer, db.ForeignKey('permission.id') , nullable = False)
)

class Permission(db.Model):
    __tablename__ = 'permission'
    id = db.Column(db.Integer, primary_key=True , autoincrement=True)
    permission_name = db.Column(db.String(100), nullable=False , unique=True)

    _add_role = db.relationship('Role' , secondary=lambda:role_permission , backref= db.backref('role', lazy = 'dynamic') , lazy = 'dynamic')
    
    def __repr__(self):
        return f"Permission('{self.permission_name}')"

假设它是我的用户 user = User(....,role-id = 1)//他是管理员

Role:
id   role_name
1    admin
2    guest

role_permision
role_id     permission_id
1               1   ( he can add)
1               2  ( he can read)

permisison
1 ----> add
2----->read
3----->view

您可以看到user1是admin,作为admin他可以添加和读取。 如何使用sqlalchemy获得此结果? 如何知道哪个用户具有哪个角色和哪些权限。

由于我是该领域的新手,并且希望学习和探索您的帮助,我们深感感谢。 预先感谢

1 个答案:

答案 0 :(得分:1)

好的,假设您有一个用户ID。您可以采用以Python为重点的方式或以SQL为重点的方式。

在python中,您需要添加relationship属性,以便user可以访问rolerole_id。在此示例中,将role = db.relationship('Role', backref='users')添加到User模型中。其次,为什么将这些关系称为_add_*?我会删除它。

要获取User对象,可以使用user = User.query.get(1),然后使用role = user.role获取Role的实例。现在,permissions = role.permissions,您就完成了。这很容易,但是需要一些查询-您只是没有注意到它。

user = User.query.get(1)
role = user.role
permissions = role.permissions

在SQL 中,您还可以创建一个查询来一次性获得所有查询:

SELECT permission_id
FROM role_permission
-- you can even remove this line and join `user and role_permission` directly
JOIN role ON role.id = role_id
JOIN user ON user.role_id = role.id
WHERE user.id = 1;

SQLAlchemy中的哪个会成为

permission_ids = db.session\
  .query(Permission.id)\
  .join(Role)\
  .join(User)\
  .filter(User.id == 1)\
  .all()

在这里,由于您在模型定义中放置了backrefsecondary属性,SQLAlchemy已经知道如何连接表!