我必须为现有应用程序实现 ACL。
所以我将 a user、group和groupmembers表添加到数据库中。我通过关联表groupmembers定义了用户和组
之间的多对多关系。
为了保护应用程序的一些资源(即item),我添加了一个额外的关联表auth_items,它应该用作组/用户与特定item之间的 ManyToMany 关系的关联表。
项目有以下列:
- user_id --> 用户表
- group_id --> 组表
- item_id --> 项目表
至少设置了user_id和group_id列。因此,可以为组或用户定义对特定项目的访问权限。
我使用 AssociationProxy 来定义用户/组和项目之间的关系。
我现在想显示用户可以访问的所有项目,但我很难做到这一点。使用以下标准:
- 应显示用户拥有的所有项目(item.owner_id = user.id)
- 应显示所有公共项目(item.access = public)
- 应显示用户有权访问的所有项目 (auth_item.user_id = user.id)
- 应该显示用户组有权访问的所有项目。
前三个标准非常简单,但我很难做到第四个。
这是我的方法:
clause = and_(item.access == 'public')
if user is not None:
clause = or_(clause,item.owner == user,item.users.contains(user),item.groups.contains(group for group in user.groups))
第三个标准产生错误。
item.groups.contains(group for group in user.groups)
我实际上不确定这是否是一个好方法。
过滤多对多关系时最好的方法是什么?
如何根据另一个列表/关系过滤多对多关系?
顺便说一句,我正在使用最新的 sqlalchemy (6.0) 和 elixir 版本
感谢您的任何见解。