在 JPA 应用程序中,我有一个场景,其中该应用程序是
列出给定用户有权提款的所有帐户
我有帐户实体和一个多对多表,其中列出了每个用户对每个帐户拥有的授权 - 为了实现上述场景,应用程序当前只是内部联接两个表 - 这非常快。
现在,我计划添加一个显式授权层(基于 apache shiro / spring security / 其他)以将授权相关逻辑与其余代码隔离,但是......
数据库中有大约 10k 个帐户,“普通”用户被授予对所有帐户“存款”、对其中一半帐户“查看”以及对少数帐户“提款”的权限。
是否有任何安全框架可以有效地实现这种情况?
即:他们中的任何一个都能够“装饰”“从帐户 a 中选择一个”类型的 JPA 查询(或等效的 SQL),从而获取帐户列表无需从数据库加载所有用户授权,并且无论如何,无需检索所有帐户?)
看一下阿帕奇·希罗 http://shiro.apache.org/.
它允许您提取一次用户授权并在会话期间缓存它。此外,如果所有用户都可以查看所有帐户,那么您就不需要显式定义这一点,这将显着减少开销。
如果您的解决方案需要实时访问处理程序,Shiro 也可以在运行时动态重置权限。
Shiro 允许您实现典型的 RBAC 并定义如下权限:
domain:action:instance
因此,在您的情况下,用户的权限可能如下所示:
account:deposit:* // deposit all accounts
account:view:1111
account:view:2222
account:view:3333 // view on these accounts
account:withdraw:5555
account:withdraw:6666 // withdraw on these accounts
在代码中你可以做这样的事情:
if (SecurityUtils.getSubject().isPermitted("account:withdraw:"+account.getAccountNumber() ) {
// handle withdraw
}
Shiro 还具有用于额外抽象的注释驱动权限。
EDIT
Shiro 权限是最终结果,而不是起点。我使用了一组表来表示用户到角色和角色到权限的映射以及到实例的其他映射。在 AuthN 之后,它通常是一组由用户 PK 索引的简单查询,以构建呈现权限所需的数据结构。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)