使用 apache shiro 的用户角色与用户权限

Posted

技术标签:

【中文标题】使用 apache shiro 的用户角色与用户权限【英文标题】:User roles vs. user permissions using apache shiro 【发布时间】:2016-09-22 16:36:01 【问题描述】:

我正在尝试使用 apache shiro 对一些复杂的权限管理系统进行建模。

英语不是我的母语,恐怕我会漏掉一些微妙的术语,例如“角色”、“权限”、“权利”和“特权”。

例如,假设我想创建一个系统来管理建筑物内的打印机等资源。 DB 保存了哪台打印机位于哪座建筑物中的信息。 该系统的用户应该能够重置打印机或打印到它。

我很清楚,有些用户将是“超级管理员”,并且能够重置并打印到任何打印机('printer:*:*')- 我想我们可以说这些人拥有“超级管理员”角色”。

但是,如果允许某人重置特定建筑物('building:A:*')中的打印机怎么办? “建筑管理员”是一个(参数化的)角色吗?或者这只是对特定建筑物的许可?您将如何使用 apache Shiro 进行建模?

n.b. 在标记此 QI 时添加了 user-roles 标签,它说:“用户角色是一组在系统上共享相同特权或权限的用户。使用此标签可以解决有关用户角色在特定安全框架中如何工作的问题,或有关在您的程序中实现用户角色的问题。”

我是否正确地假设基于此定义没有“建筑物管理员”这样的角色,因为作为建筑物 A 的管理员不会给您与作为建筑物 B 的管理员相同的权限? 如果是这样,描述“建筑管理员”的正确术语是什么?

【问题讨论】:

【参考方案1】:

您是否考虑过在 WildCardPermission 格式中使用三个以上的令牌?

可以使用的令牌数量没有限制,因此在您的应用程序中使用它的方式取决于您的想象力。

——WildCardPermission Javadoc

您可以添加另一个标记来表示建筑物,而不是 Apache Shiro 示例和文档中常用的 domain:action:instance 语法,例如printer:print,reset:*:buildingA.

此方案的缺点是,无论何时您检查是否允许在特定打印机上执行操作,您现在还必须指定位置,即使表示打印机实例的令牌可能已经唯一标识了该打印机:

// let's say the role for buildingA-admin has permission of "printer:*:*:buildingA"

subject.isPermitted("printer:print:epson123:buildingA"); // returns true
subject.isPermitted("printer:print:epson123"); // returns false

根据您的应用程序域,可能像buildingA:printer:print,reset:epson123 这样的结构甚至可能更合适或更有用。


要回答您关于用户角色的其他问题,您可以正确假设如果您同时拥有buildingA-adminbuildingB-admin 角色,如果分配的权限它们是不同的用户角色对他们来说是不一样的。 您可以设想一个普通用户角色Building Admin 以获得不同建筑物的所有管理员可能拥有的共同权限,以避免在不同建筑物特定的管理员角色之间重复这些权限。

【讨论】:

谢谢。我将不得不研究这个选项,因为我不确定对我自己的域有什么影响。特别是因为在我自己的域中,“打印机”可以在“建筑物”之间移动。

以上是关于使用 apache shiro 的用户角色与用户权限的主要内容,如果未能解决你的问题,请参考以下文章

Apache shiro:使用 ldap 进行用户身份验证,使用数据库获得角色/权限?

Apache Shiro 使用手册Shiro 配置说明

Apache Shiro, No GUI?

我在骆驼下使用 apache shiro,我无法使用 ldap/active 目录将组映射到角色

Cas(用于身份验证)+ OpenLDAP(用于用户名、密码+角色和权限)+ Apache Shiro(用于授权)

我可以将 Apache Shiro 用于分层用户模型吗?