2011-06-21 77 views
1

和我有一個關於限制的查詢結果的問題: 域用戶:如何限制域結果與我是新來的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頁面片段,顯示結果:

<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,則顯示所有內容。如果角色不是admin,只顯示某個登錄值的結果(即只顯示登錄名=當前用戶的結果)

感謝您的幫助! 傑森

回答

0

定義您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部分獲取更多信息。

+0

太棒了!切換到安全插件確實有幫助 – jason

4

最好的&完全認證的解決方案是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

+0

感謝您的幫助!如你所建議的,我切換到安全性插件,它使事情變得更容易。謝謝! – jason

相關問題