【问题标题】:How to limit domain results with criteria如何使用标准限制域结果
【发布时间】:2011-06-21 01:58:03
【问题描述】:

我是 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'
        }   
    }
}

显示结果的我的 GSP 页面 sn-p:

<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>

我用这段代码在单独的 gsp 视图中调用控制器:

<g:link class="users" controller="user" params="[sort:'fname',order:'desc']" action="">Manager Users</g:link>

我的问题是,如何调用域并根据以下条件显示结果:首先,如果角色是管理员,则显示所有内容。如果角色不是admin,只显示某个登录值的结果(即只显示登录=当前用户的结果)

感谢您的帮助! 杰森

【问题讨论】:

    标签: grails groovy


    【解决方案1】:

    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")
    }
    

    有关条件的详细信息,请参阅here

    【讨论】:

    • 感谢您的帮助!按照你们的建议,我切换到了安全插件,这让事情变得更容易了。谢谢!
    【解决方案2】:

    定义您的 users 控制器 index 操作,例如:

    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) ]
            }
        }
    
        // ...
    
    }
    

    有关更多信息,请参阅spring-security-core 插件文档中有关helper classes 的部分。

    【讨论】:

    • 太棒了!切换到安全插件真的很有帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-01
    • 1970-01-01
    • 2017-10-21
    • 2016-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多