我的应用程序中有一个用户需要按类别公开某些数据
例如:
使用ROLE_CAMPAIGN的用户A只能看到广告系列 _category_id = 5
使用ROLE_CAMPAIGN的用户b只能看到广告系列 _category_id IN(5,10,4)
(选择,插入,更新,删除)
用户和广告系列是休眠实体
他们的联系是ManyToMany(用户有CampaignsCategories)
如果我将其翻译为 native SQL
SELECT * FROM CAMPAIGNS WHERE CATEGORY_ID IN (SELECT ID FROM USER_CATEGORIES)
然后继续。
为具有某个角色的用户实施动态的正确方法是什么。
很少的例子会有所帮助。
(春季安全3)
答案 0 :(得分:2)
您正在寻找安全模型缺点的技术解决方案。
具有相同角色的人员应具有相同的访问权限。
如果您发现您的安全决策不符合此条件,则需要重新定义角色以使其更加精细。
答案 1 :(得分:2)
看起来您可以使用访问控制列表(ACL)来解决此问题:2名员工具有相同的ROLE_EMPLOYEE,无法执行管理员可以执行的操作,但在该周边内,他们不允许查看或删除每个其他人的记录。
http://static.springsource.org/spring-security/site/docs/3.0.x/reference/domain-acls.html请给你一个更好的主意。
答案 2 :(得分:0)
角色不是您正在寻找的答案。访问控制列表是Emanuel所述问题的解决方案。配置为使用角色时,Spring安全性无法在本机上区分具有相同角色的两个用户。
答案 3 :(得分:0)
通常,RBAC不能为每个受控实体提供不同的权限。 RBAC是二维的 - 权限X ROLE。通常没有任何机制可以测试哪些内容受到控制。您可以使用RBAC来实现这一目标,但是需要很多ROLES才能完成,而且一些自定义并且您最终还是会创建ACL。
另一方面,ACL本身就是3维 - 权限X ROLES X对象都可以在完整集或部分集中相互定义:
权限X ROLE X对象(完整的ACL) 权限X角色(RBAC) ROLE X对象(有用吗?) 权限X对象(有用?)
两个ACL和RBAC允许为人们分配不同的ROLES。 MOST RBAC不允许以任何其他方式分配权限。
但是,许多ACL能够直接向特定对象/实体的人员分配权限。如果这是ACL的一个特性,它会增加复杂性和速度损失的大量灵活性。只为一个人创建一个ROLE就好了。因此,不要直接向人们分配权限。
你的问题主要是你没有区分ROLES的类型,但RBAC不会为你做这件事。您应该使用ACL。如果您可以设置表格显示权限与ROLE和ROLE与对象,您将使您的理解更长。
大多数优秀ACL具有的另一个元素:对象组。这就是您需要批量处理或“随时随地”分配权限。您的广告系列的创建代码会按类别预先分配组,然后ROLES和权限会自然发生。