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

时间:2016-05-25 07:51:29

标签: permissions shiro user-roles

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

英语不是我的母语我担心我可能会遗漏一些术语的微妙之处,如“角色”,“权限”,“权利”和“特权”。

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

我很清楚,有些用户将成为“超级管理员”并能够重置并打印到任何打印机('打印机:*:*') - 我想我们可以说那些人有“超级管理员”的作用。”

但是如果允许某人重置特定建筑物中的打印机('建筑物:A:*')怎么办? “建筑管理员”是一个(参与)角色吗?或者这仅仅是特定建筑的许可?你会如何使用apache Shiro来模拟这个?

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

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

1 个答案:

答案 0 :(得分: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的一般用户角色,以获取不同建筑物的所有管理员可能具有的权限,以避免在不同的特定于建筑物的管理角色中复制这些权限。