鉴于主题具有以下权限:
printer:1:manage
printer:2:manage
printer:3:admin
printer:1:print
printer:4:print
我知道我可以问:
subject.isPermitted('printer:1:manage')
但我怎么问shiro问题,如:
对于哪个打印机ID,主题具有“管理”权限? (我想要答案1,2)
对于哪个打印机ID,主题是否具有权限(或任何类型)? (我想要答案1,2,3)
对于哪个打印机ID,主题具有管理或管理权限? (我想要答案1,4)
答案 0 :(得分:1)
Apache Shiro的API仅提供权限或角色的检查和断言;它没有提供任何查找程序方法来查找主题有权访问的内容,或查找哪些主题拥有权限。
您可以探索在findPermissions()
中实施自己的AuthorizingRealm
并获取查询权限,并收集queryPermission.implies(grantedPermission)
返回{{}的主题的所有可用权限1}},有点沿着这些方向:
true
请注意,这与protected Collection<Permission> findPermissions(Permission queryPermission, AuthorizationInfo info) {
Collection<Permission> foundPermissions;
Collection<Permission> perms = getPermissions(info);
if (perms != null && !perms.isEmpty()) {
foundPermissions = new ArrayList<Permission>();
for (Permission perm : perms) {
if (queryPermission.implies(perm)) {
foundPermissions.add(perm);
}
}
}
else {
foundPermissions = Collections.emptyList();
}
return foundPermissions;
}
执行检查的方式有implies
的反比关系。
如果您还没有致力于Apache Shiro,那么,开源OACC security framework (披露:我是维护者和共同作者)实际上具有高效的对称查询方法找到资源的权限,以及哪些资源拥有某些权限,而无需实现任何内容。