我正在尝试制作概念验证应用程序,该应用程序允许具有管理权限的用户授予和撤消其他用户的权限。虽然授予和撤销仅使用用户名(唯一标识符),但获得在UI中显示的权限证明是不可及的。是否可以从服务方法中获取其他用户的权限列表?
我试图在网上搜索,但我找不到适用于我的问题的任何解决方案。我尝试过使用SwitchUserAuthorityChanger,RunAsManager和aclService.readAclsById。这些都没有。
我使用Grails 3.3.2和Spring-Security 3.2.0以及ACL 3.2.0。
干杯人!
答案 0 :(得分:0)
我最终解决了这个问题。我会在这里发布答案,以防一些可怜的灵魂遇到类似的问题。
在ACL数据库表中挖掘了一下之后,我创建了一个单独的服务,其中我的id为AclObjectIdentity
,我得到用户sid。使用这些变量,我找到AclEntry
的所有相关变量。之后,只需通过掩码获得权限。
以下是可以帮助任何人的方法:
def getPermissions(Object domainObject, String sid) {
Map<String, String> returnValue = [
"status": "success"
]
def aclObject = AclObjectIdentity.findByObjectId(domainObject.id)
def userAclSid = AclSid.findBySid(sid)
if (null == userAclSid || null == aclObject) {
returnValue["status"] = "failed"
return returnValue
}
def aclEntries = AclEntry.findAllBySidAndAclObjectIdentity(userAclSid, aclObject)
returnValue["permissions"] = []
def tempMap = [:]
if (null == aclEntries) {
returnValue["permissions"] = "null"
return returnValue
}
def counter = 0
for (entry in aclEntries) {
int mask = entry.mask
BasePermission permission
for (BasePermission perm in PermissionEnum.toList()) {
int test = 1 << mask
if (perm.getMask() == test) {
permission = perm
break;
}
}
def permString = PermissionEnum.getPermission(permission)
tempMap["$counter"] = permString
counter++
}
returnValue["permissions"] = tempMap
return returnValue
}