Java apacheshiro中的实例级访问控制

Java apacheshiro中的实例级访问控制,java,shiro,Java,Shiro,我发现了一个非常灵活的安全框架ApacheShiro。我使用Shiro成功地实现了身份验证和授权 该框架的一个吸引人的特性是基于实例的安全性。我刚刚从Shiro网站上复制了这个例子 以下权限存储在数据库中 printer:query:lp7200 printer:print:epsoncolor 以下代码检查给定打印机实例的当前经过身份验证的用户是否具有权限 if ( SecurityUtils.getSubject().isPermitted("printer:query:lp7200")

我发现了一个非常灵活的安全框架ApacheShiro。我使用Shiro成功地实现了身份验证和授权

该框架的一个吸引人的特性是基于实例的安全性。我刚刚从Shiro网站上复制了这个例子

以下权限存储在数据库中

printer:query:lp7200
printer:print:epsoncolor
以下代码检查给定打印机实例的当前经过身份验证的用户是否具有权限

if ( SecurityUtils.getSubject().isPermitted("printer:query:lp7200") {
 // Return the current jobs on printer lp7200
}
我的问题是“权限是如何存储在数据库中的?” 是否有更好的方法存储基于实例的权限

请让我知道


谢谢

如何存储这些信息完全取决于您自己。您的
Realm
实现负责查询您正在使用的任何数据源,并以您喜欢的格式提取权限数据

有些人直接将其存储为字符串(如示例中所示),另一些人将其存储在专用表中(例如,如果使用RDBMS)(例如,权限类型、目标、操作列)。您可以将权限实体与角色关联,也可以直接与分配给用户的用户或组关联,等等,但这对您的应用程序来说是有意义的

您的存储选项完全由您决定。您可以具体化数据,但需要确保
Realm.isPermitted(…)
操作按预期运行

与直接实现
Realm.isPermitted(…)
方法不同,许多人发现将抽象
authorizationrealm
类子类化并重写
doGetAuthorizationInfo
方法并返回支持权限表示的
AuthorizationInfo
实例更方便

在这种方法中,您可以查询数据存储,将返回的数据转换为
AuthorizationInfo
实例,然后就可以完成了(别忘了启用授权缓存-您将看到巨大的性能优势)

只有在需要对查询等进行非常具体的控制时,才需要重写
领域
isPermitted
方法