Apache Shiro 中的实例级访问控制

Posted

技术标签:

【中文标题】Apache Shiro 中的实例级访问控制【英文标题】:Instance level access control in Apache Shiro 【发布时间】:2012-02-14 05:49:04 【问题描述】:

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

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

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

printer:query:lp7200
printer:print:epsoncolor

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

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

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

请告诉我。

谢谢

【问题讨论】:

【参考方案1】:

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

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

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

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

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

仅当您想要非常具体地控制查询等时,才需要覆盖 Realm isPermitted 方法。

【讨论】:

以上是关于Apache Shiro 中的实例级访问控制的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Apache Shiro 中定义属性级权限

Spring Security和Apache Shiro开发企业级权限管理系统

spring mvc整合shiro无法访问控制器是啥问题

Apache Shiro 使用手册Shiro 授权

Shiro No SecurityManager 可供调用代码访问

shiro注解权限控制-5个权限注解