2013-07-28 70 views
0

任何用戶都可以創建他/她自己的機器人。機器人只能由創建者或管理員編輯。如何限制對使用Grails創建的用戶的編輯

下一個代碼工作完全,它是一個容易和簡單的解決方案

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

class RobotController { 

    def springSecurityService 

    def edit() { 

     if (Robot.get(params.id).usuario.username == springSecurityService.authentication.name 
     || SpringSecurityUtils.ifAnyGranted("ROL_ADMIN,ROL_SUPERADMIN"))    
      println "editing allowed" 
     else 
      println "editing denied" 

    } 
} 

但是我的老師建議我使用安全Config.groovy的網絡。下面的代碼不不行

grails.plugins.springsecurity.interceptUrlMap = [ 
    '/index.gsp': ["isAuthenticated()"], 
    '/robot/edit/**': ["Robot.get(params.id).usuario.username == springSecurityService.authentication.name 
         || hasAnyRole('ROL_ADMIN','ROL_SUPERADMIN')"], 
    '/robot/**': ["isAuthenticated()"] 
] 

它不會因爲不同的原因有:

  1. 不可能調用域類Robot Config.groovy中
  2. params.id沒有在此感覺
  3. Java「or」(||)在此處無效。我嘗試了其他方式,但不幸運。 Groovy documentation目前還不清楚。

是否可以在Config.groovy中做到這一點?如果不是,那麼正確的方法是以某種方式使用<sec:access> ... </sec:access>

回答

2

我不認爲你可以用普通的Spring Security核心做這種事情。

你的老師是正確的,你可能不應該以特別的方式實現安全性,但你不一定應該在Config.groovy中實現 - 這是有點限制。

您可能想要使用Spring Security ACL plugin,它會添加更多的域類,並允許您設置具有更細粒度細節的訪問控制。

結賬the official docs。你可能需要一些時間來學習它,但它比推出你自己的ACL機制要好得多。

+0

謝謝。我一直在仔細閱讀文檔。它看起來是一個不錯的插件,但我認爲它很大程度上增加了代碼的複雜性。在這種情況下,我更喜歡我發佈的代碼('if(Robot.get(params.id).usuario.username =='...),因爲它很簡單並且工作正常。幾天來看看有人能給我們任何其他的想法,如果沒有,我會接受這個答案,因爲它是完全正確的,儘管我會用這個插件來處理更復雜的情況。 – chelder

相關問題