Apache Shiro - 主题权限和目标津贴
Apache Shiro - Subject Permissions and Target Allowances
假设我们有多个用户和文档。
用户可以使用权限访问文档,例如:document:id:action(例如document:1:edit、document:2:read)。
现在我还希望可以选择从我的文档端向多个用户授予访问权限,例如(user:*:read) -> 所有用户都应该有读取权限。
我是否在 Apache Shiro 中遗漏了一些明显的东西,或者这是不可能的?
SecurityUtils.getSubject().isPermitted(document:8:read)
只会覆盖user -> document这个方向。
我如何实现类似的东西
SecurityUtils.getTarget().allows(user:7:write)
?
我可以将所有文档权限作为列表获取。我将如何检查此列表以获得特定权限?
本质上,我正在寻找 Shiro 方面的辅助功能,这样我就可以做到:
allPermissions = ['user:6:write', 'user:*:read']
permissionToCheck = 'user:95:read'
isPermitted(allPermissions, permissionToCheck)
我自己提出一个答案:
List<String> notebookPermissions = ...;
String permissionToCheck = "user:read:" + getUser().getId();
Permission resolvedPermissionToCheck = resolver.resolvePermission("user:read:" + getUser().getId())
List<Permission> permissions = notebookPermissions.stream().map(p ->
resolver.resolvePermission(p)).collect(Collectors.toList());
for (Permission perm : permissions) {
if (perm.implies(resolvedPermissionToCheck)) {
return true;
}
}
return false;
您如何看待这种方法?
假设我们有多个用户和文档。
用户可以使用权限访问文档,例如:document:id:action(例如document:1:edit、document:2:read)。
现在我还希望可以选择从我的文档端向多个用户授予访问权限,例如(user:*:read) -> 所有用户都应该有读取权限。
我是否在 Apache Shiro 中遗漏了一些明显的东西,或者这是不可能的?
SecurityUtils.getSubject().isPermitted(document:8:read)
只会覆盖user -> document这个方向。
我如何实现类似的东西
SecurityUtils.getTarget().allows(user:7:write)
?
我可以将所有文档权限作为列表获取。我将如何检查此列表以获得特定权限?
本质上,我正在寻找 Shiro 方面的辅助功能,这样我就可以做到:
allPermissions = ['user:6:write', 'user:*:read']
permissionToCheck = 'user:95:read'
isPermitted(allPermissions, permissionToCheck)
我自己提出一个答案:
List<String> notebookPermissions = ...;
String permissionToCheck = "user:read:" + getUser().getId();
Permission resolvedPermissionToCheck = resolver.resolvePermission("user:read:" + getUser().getId())
List<Permission> permissions = notebookPermissions.stream().map(p ->
resolver.resolvePermission(p)).collect(Collectors.toList());
for (Permission perm : permissions) {
if (perm.implies(resolvedPermissionToCheck)) {
return true;
}
}
return false;
您如何看待这种方法?