【问题标题】:Match one Sec role among many roles of SecUser grails在 SecUser grails 的多个角色中匹配一个 Sec 角色
【发布时间】:2012-02-21 05:27:27
【问题描述】:

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

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

在这里,我得到了所有用户的 userInstance 以及 adminuser 现在我试图从我的 userInstance 中删除 adminuser 并将其保存在 selectUserMap 中,但有时会得到结果,有时它会给所有用户。我认为 sort() 函数没有对用户实例角色进行排序,请帮助我

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)

【问题讨论】:

    标签: grails


    【解决方案1】:

    使用分层角色会有所帮助 - 请参阅http://grails-plugins.github.com/grails-spring-security-core/docs/manual/ 的“14 分层角色”部分 - 然后您不会将 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])
    

    【讨论】:

      【解决方案2】:

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

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

      我猜你可以从这个selectUserList 列表中构建selectUserMap(不明白你从哪里得到j

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

      【讨论】:

      • 这更清楚,但仍然过于昂贵,因为您从数据库加载 每个 用户实例只是为了在客户端过滤它们。
      猜你喜欢
      • 2019-05-15
      • 2021-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-14
      • 1970-01-01
      • 2017-06-29
      相关资源
      最近更新 更多