我正在尝试使用apache shiro建模一些复杂的权限管理系统。
英语不是我的母语我担心我可能会遗漏一些术语的微妙之处,如“角色”,“权限”,“权利”和“特权”。
例如,假设我想创建一个管理资源的系统,例如位于建筑物内的打印机。 DB保存哪个打印机位于哪个建筑物中的信息。 该系统的用户应该能够重置打印机或打印到它。
我很清楚,有些用户将成为“超级管理员”并能够重置并打印到任何打印机('打印机:*:*') - 我想我们可以说那些人有“超级管理员”的作用。”
但是如果允许某人重置特定建筑物中的打印机('建筑物:A:*')怎么办? “建筑管理员”是一个(参与)角色吗?或者这仅仅是特定建筑的许可?你会如何使用apache Shiro来模拟这个?
n.b。
标记此QI时添加了user-roles标记,并说:“用户角色是在系统上共享相同权限或权限的一组用户。使用此标记可以了解用户角色在特定安全框架中的工作方式,或者有关在程序中实现用户角色的问题。“
我是否可以正确地假设基于此定义不存在“建筑管理员”这样的角色,因为作为建筑物A的管理员不会给予与建筑物B的管理员相同的权限? 如果是这样,描述“建筑管理员”的正确术语是什么?
答案 0 :(得分:1)
您是否考虑过在WildCardPermission格式中使用三个以上的令牌?
可以使用的令牌数量没有限制,因此在您的应用程序中可以使用的方式取决于您的想象。
您可以添加另一个令牌来代表建筑物,而不是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-admin
和buildingB-admin
个角色,则他们是不同的用户角色,如果分配给它们的权限不同。
您可以设想Building Admin
的一般用户角色,以获取不同建筑物的所有管理员可能具有的权限,以避免在不同的特定于建筑物的管理角色中复制这些权限。