Grails 如何使用条件限制域结果

Grails 如何使用条件限制域结果,grails,groovy,Grails,Groovy,我是grails新手,我对限制查询结果有一个问题: 域用户: class User { String login String password String fname String lname String role = "user" static constraints = { login (size:5..15, blank:false, unique:true, matches:"[a-zA-Z0-

我是grails新手,我对限制查询结果有一个问题: 域用户:

class User {    
    String login
    String password
    String fname
    String lname
    String role = "user"    

    static constraints = {
        login    (size:5..15, blank:false, unique:true, matches:"[a-zA-Z0-9]+")
        password (size:5..15, blank:false)
        fname    (blank:false)
        lname    (blank:false)
        role     (inList:["user", "admin"])
    }

    String toString(){
        fname & " " & lname
    }

    static mapping = {
        cache true

        columns {
            fname     type:'text'
            lname     type: 'text'
            password  type:'text'
            login     type:'text'
        }   
    }
}
显示结果的my GSP页面片段:

<g:each in="${userInstanceList}" status="i" var="userInstance">
  <tr class="${(i % 2) == 0 ? 'odd' : 'even'}">
    <td><g:link action="show" id="${userInstance.id}">
      ${fieldValue(bean: userInstance, field:   "id")}</g:link></td>
    <td>${fieldValue(bean: userInstance, field: "login")}</td>
    <td>****</td>
    <td>${fieldValue(bean: userInstance, field: "fname")}</td>
    <td>${fieldValue(bean: userInstance, field: "lname")}</td>
    <td>${fieldValue(bean: userInstance, field: "role")}</td>
  </tr>
</g:each>

${fieldValue(bean:userInstance,字段:“id”)}
${fieldValue(bean:userInstance,field:“login”)}
****
${fieldValue(bean:userInstance,字段:“fname”)}
${fieldValue(bean:userInstance,字段:“lname”)}
${fieldValue(bean:userInstance,field:role”)}
在单独的gsp视图中,我使用此代码调用控制器:

<g:link class="users" controller="user" params="[sort:'fname',order:'desc']" action="">Manager Users</g:link>
Manager用户
我的问题是,如何根据以下条件调用域并显示结果:首先,如果角色是admin,则显示所有内容。如果角色不是admin,则仅显示特定登录值的结果(即,仅显示登录=当前用户的结果)

谢谢你的帮助!
jason

定义您的
用户
控制器
索引
操作,例如:

def index = {
    if (isAdmin()) {
        [ userInstanceList: User.list(params) ]
    } else {
        [ userInstanceList: User.findAllByLogin(currentUser.login) ]
    }
}
当然,您需要定义
isAdmin()
currentUser
,但这取决于您的安全实现。如果使用
spring security core
插件,您可以使用:

import org.codehaus.groovy.grails.plugins.springsecurity.SpringSecurityUtils

class UsersController {

    def springSecurityService

    def index = {
        if (SpringSecurityUtils.ifAllGranted(['ROLE_ADMIN'])) {
            [ userInstanceList: User.list(params) ]
        } else {
            [ userInstanceList: User.findAllByLogin(springSecurityService.currentUser.login) ]
        }
    }

    // ...

}

有关更多信息,请参阅插件文档中的部分。

定义您的
用户
控制器
索引
操作,例如:

def index = {
    if (isAdmin()) {
        [ userInstanceList: User.list(params) ]
    } else {
        [ userInstanceList: User.findAllByLogin(currentUser.login) ]
    }
}
当然,您需要定义
isAdmin()
currentUser
,但这取决于您的安全实现。如果使用
spring security core
插件,您可以使用:

import org.codehaus.groovy.grails.plugins.springsecurity.SpringSecurityUtils

class UsersController {

    def springSecurityService

    def index = {
        if (SpringSecurityUtils.ifAllGranted(['ROLE_ADMIN'])) {
            [ userInstanceList: User.list(params) ]
        } else {
            [ userInstanceList: User.findAllByLogin(springSecurityService.currentUser.login) ]
        }
    }

    // ...

}

有关更多信息,请参阅插件文档中的部分。

一个最佳且全面的身份验证解决方案是Gustavo建议的SpringSecurity插件,但我假设您只需要一个简单的标准示例。在控制器中,您可以如下设置
userInstanceList

def currentUser = User.get(1); // put your current user here
def c = User.createCriteria()
def userInstanceList = c.list {
    or {
        and {
                  ne("role","admin")
                  eq("login",currentUser.login)
                }
        eq("role", "admin")
    }
    maxResults(10)
    order("login", "asc")
}

可以找到有关标准的详细信息。

Gustavo建议的一个最佳和全面的身份验证解决方案是SpringSecurity插件,但我假设您只需要一个简单的标准示例。在控制器中,您可以如下设置
userInstanceList

def currentUser = User.get(1); // put your current user here
def c = User.createCriteria()
def userInstanceList = c.list {
    or {
        and {
                  ne("role","admin")
                  eq("login",currentUser.login)
                }
        eq("role", "admin")
    }
    maxResults(10)
    order("login", "asc")
}

可以找到有关标准的详细信息。

太好了!切换到安全插件真的很有帮助!切换到安全插件真的很有帮助谢谢你的帮助!我按照你们的建议切换到了安全插件,这让事情变得更容易了。谢谢谢谢你的帮助!我按照你们的建议切换到了安全插件,这让事情变得更容易了。谢谢