2010-02-03 107 views
1

我正在使用grails構建一個主要用作服務框架的應用程序。我的問題是:服務是否可以像控制器一樣保護?使用Shiro在grails中保護服務

基於URI的例子:

class SecurityFilters { 
    def filters = { 
    all(uri: "/**") { 
     before = { 
     // Ignore direct views (e.g. the default main index page). 
     if (!controllerName) return true 
     // Access control by convention. 
     accessControl() 
     } 
    } 
    } 
} 

回答

3

我不知道如果四郎插件支持這一點,但Acegi plugin確實,儘管在「實驗」的方式(知道是什麼意思)。

更新

讀過問題正確,似乎你問你是否可以使用篩選器安全服務。如果是這種情況,那麼Shiro有點不相關,因爲它是執行授權的過濾器,而不是Shiro。

因此,要回答您是否可以使用過濾器來保護服務的問題,答案是否定的,因爲您只能從過濾器中訪問控制器。但是,您可以使用Groovy元編程在服務上執行AOP樣式的方法攔截。

的基本方法是:

  • 對於每一個服務,一個invokeMethod屬性添加到元類
  • 此屬性的值應該是一個封閉。這個閉包將攔截(即被調用,而不是)服務上調用的每個方法。
  • 這蓋子應該
    • 執行安全檢查
    • 調用原來的方法,如果認證成功,並拋出一個異常(或顯示錯誤)如果授權失敗

除了

如果可能,我會強烈建議使用證明安全插件(例如Shiro,Acegi)執行授權檢查,而不是按照上述方式滾動您的自己。

+0

謝謝。我正在使用shiro,而不是acegi。我想利用過濾來保護服務。對不起,如果不明確。 – Brandon 2010-02-03 16:01:00

+0

謝謝你的意見。 – Brandon 2010-02-26 16:13:52