在SecUser grails的许多角色中匹配一个Sec角色

时间:2012-01-28 15:55:22

标签: grails

我有以下五个角色的管理员用户[ROLE_ADMIN,ROLESWITCHUSER,ROLE_DOCTOR,ROLE_USER] 和一些只有一个角色的普通用户,即ROLE_USER,现在我的问题是如何才能从我的secuser表中获得普通用户,我尝试使用somne​​迭代

def roleId=SecRole.findByAuthority("ROLE_USER")
userInstance = SecUserSecRole.findAllBySecRole(roleId).secUser

这里我和所有用户一起使用userInstance以及adminuser现在我试图从我的userInstance中删除adminuser并将其保存在selectUserMap中但是有时会得到结果,有时会给所有用户。我认为sort()函数没有排序userinstansce角色请帮助我

for(int i=0;i<userInstance.size();i++) 
{
    println( "am in loop "+i+userInstance[i].username+"roles"+userInstance[i].getAuthorities())
    def x=(userInstance[i].getAuthorities().sort())

    for(a in x )
    {   //println(a.getAuthority()) 
        if((a.getAuthority() == use))
            abc=true
        else
            abc=false
        if((a.getAuthority() == adm))
        {
            println("break")
            break;
        }
        abc=(abc && (a.getAuthority() == use))
        if(abc)
        {   
            println("am in true if  ")
            selectUserMap.add(j,userInstance[i])
            j=j+1
        }
        else  
        {           
            println("am in else")
        }

    }

}
println("==============all users "+selectUserMap)

2 个答案:

答案 0 :(得分:1)

有一点可以帮助我们使用分层角色 - 参见&#34; 14 Hierarchical Roles&#34;在http://grails-plugins.github.com/grails-spring-security-core/docs/manual/ - 然后你不会向ROLE_USER授予{&1 34}真实&#34;用户。如果您定义了这样的层次结构:

grails.plugins.springsecurity.roleHierarchy = '''
   ROLE_ADMIN > ROLE_USER
   ROLE_DOCTOR > ROLE_USER
   ROLE_ADMIN > ROLE_DOCTOR
'''

然后您不需要将数据库中的ROLE_USER明确授予医生或管理员,但该角色将被推断为已授予。然后您的原始查询将起作用:

def userRole = SecRole.findByAuthority("ROLE_USER")
def usersWithUserRole = SecUserSecRole.findAllBySecRole(userRole).secUser

如果您不能或不想这样做,那么您应该使用正确的数据库查询。从数据库加载每个用户和每个用户的角色并在应用程序中过滤掉它们是极其昂贵且不必要的。使用此HQL查询:

def userRole = SecRole.findByAuthority("ROLE_USER")
def users = SecUserSecRole.executeQuery(
   'select u from SecUser u where ' +
   '(select count(ur.user) from SecUserSecRole ur where ur.user=u)=1 and ' +
   '(:r in (select ur.role from SecUserSecRole ur where ur.user=u))',
   [r: userRole])

答案 1 :(得分:0)

哦,你选择了非常复杂的方式,可以理解你的算法:(也许这就够了:

List selectUserList = userInstance.findAll {
   List roles = it.authorities*.authority
   return roles.contains('ROLE_USER') && !roles.contains('ROLE_ADMIN')
}

我猜您可以从此selectUserMap列表构建selectUserList(无法理解您获取的位置j

PS也许最好将userInstance重命名为userInstances,因为它实际上是一个列表,而不是一个实例?