1

我必须为现有应用程序实现 ACL。
所以我将 a usergroupgroupmembers表添加到数据库中。我通过关联表groupmembers定义了用户
之间的多对多关系。 为了保护应用程序的一些资源(即item),我添加了一个额外的关联表auth_items,它应该用作组/用户与特定item之间的 ManyToMany 关系的关联表。

项目有以下列:

  • user_id --> 用户表
  • group_id --> 组表
  • item_id --> 项目表

至少设置了user_idgroup_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 版本

感谢您的任何见解。

4

1 回答 1

1

contains()方法是单项检查。假设您的组表映射到Group类,请尝试以下操作:

item.groups.any(Group.id.in_([group.id for group in user.groups])
于 2010-06-03T12:09:32.633 回答