2014-04-07 64 views
0

我試圖創建一個簡單的應用程序,實際上是一個概念驗證,我的最終用戶只通過RESTful服務與服務器交互。我的用戶界面將使用angularjs向這些服務發送ajax請求,然後在瀏覽器中呈現響應。Grails - 基本身份驗證的彈簧安全只有

爲了創建一個安全層,我試圖配置spring安全插件,但是我的配置存在問題。在這個非常時刻,這是我的配置:

grails.plugin.springsecurity.userLookup.userDomainClassName = 'mymoney.Subject' 
grails.plugin.springsecurity.userLookup.authorityJoinClassName = 'mymoney.SubjectRole' 
grails.plugin.springsecurity.authority.className = 'mymoney.Role' 

grails.plugin.springsecurity.useBasicAuth = true 
grails.plugin.springsecurity.basic.realmName = "Restricted Access" 

grails.plugin.springsecurity.controllerAnnotations.staticRules = [ 
    '/**': ['permitAll'] 
] 

grails.plugins.springsecurity.filterChain.chainMap = [ 
    '/rest/**': 'JOINED_FILTERS,-exceptionTranslationFilter', 
    '/**': 'JOINED_FILTERS,-basicAuthenticationFilter,-basicExceptionTranslationFilter' 
] 

如果我把我的配置這樣的,一切都提供給大家,連/ REST/**資源。我的猜測是,chainMap之前的staticRules正在搞亂所有東西。但問題是,如果我刪除它,那麼一切都屬於我的基本身份驗證...

所以我真正想要的是,/ rest/**下的每個資源都將通過基本身份驗證和我的SPA(單個頁面應用程序),可以在根上下文('/')訪問,沒有任何身份驗證的情況下,每個人都可以訪問它...

我在這裏丟失了什麼?

回答

2

如果您擁有/ ** = permitAll,您無法在過濾器鏈中對網址進行分區。您還需要分割的訪問規則,像

grails.plugin.springsecurity.controllerAnnotations.staticRules = [ 
    '/rest/**': ['ROLE_ADMIN'], 
    '/**': ['permitAll'] 
] 
1

只是對伯特的正確答案細說,你可以找到你需要在docs for the plugin知道的一切。

儘管如此,「permitAll」表達式實際上使相應的URL可公開訪問。在這種情況下,「/ **」URL是相應的URL,它對應於該域下的每個可能的URL。因此,您的staticRules配置使您的整個應用程序可公開訪問。

的解決方案是隻指定在可公開訪問的資源(「/ /圖像/」,「/登錄/ 」等)的「permitAll」表達,然後指定在固定的URL替代表達式(」/admin/ *'等)。

「permitAll」表達式是Spring表達式語言(SpEL)的成員。在我鏈接的文檔底部有一個包含許多SpEL表達式的表格。使用SpEL,您可以爲您的應用程序配置各種訪問規則。例如:

grails.plugin.springsecurity.controllerAnnotations.staticRules = [ 
    '/**/images/**': ['permitAll'],  // publicly accessible images directory 
    '/register': ['isAnonymous()'],  // has to be anonymous to register 
    '/profile/**': ['isAuthenticated()'], // has to be authenticated 
    '/lounge/**': ['ROLE_USER', 'ROLE_ADMIN'], // has user or admin role 
    '/admin/**': ['ROLE_ADMIN']   // has to be an administrator 
] 

還有更多選項可供選擇,文檔是一個很好的信息資源。