Совпадение одной роли Sec среди множества ролей GraUs SecUser - PullRequest
0 голосов
/ 28 января 2012

У меня есть пользователь-администратор со следующими пятью ролями [ROLE_ADMIN, ROLESWITCHUSER, ROLE_DOCTOR, ROLE_USER] и некоторые обычные пользователи только с одной ролью, т. е. ROLE_USER, теперь мой вопрос состоит в том, как я могу получить только обычных пользователей из моей таблицы secuser, которые я пробовал с некоторыми итерациями

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

здесь я получил userInstance со всеми пользователями вместе с adminuser, теперь я попытался исключить adminuser из своего userInstance и сохранил его в 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 ]

1 голос
/ 29 января 2012

Одна вещь, которая может помочь, - это использовать иерархические роли - см. Раздел «14 иерархических ролей» по адресу http://grails -plugins.github.com / grails-spring-security-core / docs / manual / - и тогда вы не дадите ROLE_USER никому, кроме «реальных» пользователей.Если вы определяете свою иерархию следующим образом:

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])
0 голосов
/ 28 января 2012

О, вы выбрали действительно сложный способ, можете понять свой алгоритм :( Возможно, этого достаточно:

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

Я думаю, вы можете построить selectUserMap из этого selectUserList списка (не могу понять, откуда вы взяли j)

PS может быть, лучше переименовать userInstance в userInstances, потому что это на самом деле список, а не один экземпляр?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...