管理员角色可以获得Spring-security ACL Grails

时间:2018-01-26 17:18:59

标签: grails spring-security permissions acl

我正在尝试制作概念验证应用程序,该应用程序允许具有管理权限的用户授予和撤消其他用户的权限。虽然授予和撤销仅使用用户名(唯一标识符),但获得在UI中显示的权限证明是不可及的。是否可以从服务方法中获取其他用户的权限列表?

我试图在网上搜索,但我找不到适用于我的问题的任何解决方案。我尝试过使用SwitchUserAuthorityChanger,RunAsManager和aclService.readAclsById。这些都没有。

我使用Grails 3.3.2和Spring-Security 3.2.0以及ACL 3.2.0。

干杯人!

1 个答案:

答案 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
}