8

我发现 Apache Shiro 确实是一个灵活的安全框架。我使用 Shiro 成功实现了身份验证和授权。

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

以下权限存储在数据库中。

printer:query:lp7200
printer:print:epsoncolor

以下代码检查对于给定的打印机实例,当前经过身份验证的用户是否具有权限。

if ( SecurityUtils.getSubject().isPermitted("printer:query:lp7200") {
 // Return the current jobs on printer lp7200
}

我的问题是“这就是权限在数据库中的存储方式吗?” 有没有更好的方法来存储基于实例的权限?

请告诉我。

谢谢

4

1 回答 1

11

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

有些人直接将它们存储为字符串(如您的示例中所示),其他人将它们存储在专用表中(例如,如果使用 RDBMS)(例如,permission_type、target、action 列)。您可以将权限实体关联到角色或直接关联到用户或分配给用户的组等 - 但是这对您的应用程序有意义。

您的存储选项完全取决于您。您可以实现数据,但您希望确保Realm.isPermitted(...)操作按预期运行。

与直接实现方法不同,许多人发现继承抽象类并覆盖方法并返回支持权限表示的实例Realm.isPermitted(...)更方便。AuthorizingRealmdoGetAuthorizationInfoAuthorizationInfo

在该方法中,您可以查询您的数据存储,将返回的数据转换为AuthorizationInfo实例,然后就完成了(不要忘记启用授权缓存——您会看到很大的性能优势)。

Realm isPermitted仅当您想要对查询等进行非常具体的控制时,才需要覆盖这些方法。

于 2012-01-20T18:44:21.380 回答