我有以下五个角色的管理员用户[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)
答案 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
,因为它实际上是一个列表,而不是一个实例?