我发现了一个非常灵活的安全框架Apache Shiro。我使用Shiro成功实现了身份验证和授权。
框架的一个吸引人的功能是基于实例的安全性。我刚从Shiro网站上复制了一些例子。
以下权限存储在数据库中。
printer:query:lp7200
printer:print:epsoncolor
以下代码检查对于给定的打印机实例,当前经过身份验证的用户是否具有权限。
if ( SecurityUtils.getSubject().isPermitted("printer:query:lp7200") {
// Return the current jobs on printer lp7200
}
我的问题是“这是权限存储在数据库中的方式吗?” 是否有更好的方法来存储基于实例的权限?
请告诉我。
由于
答案 0 :(得分:10)
您如何存储此信息完全取决于您。您的Realm
实施负责查询您正在使用的任何数据源,并以您喜欢的格式提取权限数据。
有些人直接将它们存储为字符串(如示例中所示),其他人将它们存储在专用表中(例如,如果使用RDBMS)(例如permission_type,target,action columns)。您可以将权限实体与角色关联,也可以直接关联到用户或分配给用户的组等,但这对您的应用程序有意义。
您的存储选项完全取决于您。您实现了数据,但是您希望确保Realm.isPermitted(...)
操作按预期运行。
不是直接实现Realm.isPermitted(...)
方法,许多人发现将抽象AuthorizingRealm
类子类化并覆盖doGetAuthorizationInfo
方法并返回支持AuthorizationInfo
的实例更方便许可陈述。
在该方法中,您可以查询数据存储区,将返回的数据转换为AuthorizationInfo
个实例,并且您将完成(不要忘记启用授权缓存 - 您将看到一个很大的性能优势)
只有在您希望对查询等进行非常具体的控制时,才需要覆盖Realm
isPermitted
方法。