2014-02-12 73 views
3

我在我的Grails應用程序中安裝了Spring Security Core,並使用s2-quickstart進行設置。我想'/'來處理登錄和註銷操作。這對我來說意味着沒有登錄的用戶只能訪問根頁面而沒有其他任何東西。實際上,除'/'之外的所有內容應該是沒有角色'ROLE_ADMIN'的用戶的blocket。Grails,Spring Security Core - 從應用程序中刪除/登錄/認證

我加Config.groovy中根頁上登錄表單,並設置以下配置:

grails.plugin.springsecurity.auth.loginFormUrl = '/' 
grails.plugin.springsecurity.auth.ajaxLoginFormUrl = '/' 
grails.plugin.springsecurity.failureHandler.defaultFailureUrl = '/' 
grails.plugin.springsecurity.failureHandler.ajaxAuthFailUrl = '/' 
grails.plugin.springsecurity.logout.postOnly = false 
grails.plugin.springsecurity.userLookup.userDomainClassName = 'adminpanel.security.SecUser' 
grails.plugin.springsecurity.userLookup.authorityJoinClassName = 'adminpanel.security.SecUserSecRole' 
grails.plugin.springsecurity.authority.className = 'adminpanel.security.SecRole' 
grails.plugin.springsecurity.controllerAnnotations.staticRules = [ 
    '/':        ['permitAll'], 
    '/index':       ['permitAll'], 
    '/index.gsp':      ['permitAll'], 
    '/**/js/**':      ['permitAll'], 
    '/**/css/**':      ['permitAll'], 
    '/**/images/**':     ['permitAll'], 
    '/**/favicon.ico':    ['permitAll'] 
] 

我我的每個控制器上設置@Secured(['ROLE_ADMIN'])並添加這樣的事情我index.gsp中:

<head> 
    <sec:ifAllGranted roles="ROLE_ADMIN"> 
     <meta name="layout" content="main"/> 
    </sec:ifAllGranted> 
    <sec:ifNotGranted roles="ROLE_ADMIN"> 
     <meta name="layout" content="login"/> 
    </sec:ifNotGranted> 
    <title>Home Page - Admin Panel</title> 
</head> 

有兩個問題:

  1. 配置WOR ks像我所料,但是當我輸入瀏覽器:localhost:8080/AdminPanel/login/auth頁面仍然存在,我可以訪問它甚至是註銷用戶。我想徹底刪除這個URL,無論是登錄還是註銷用戶都不應該能夠訪問它。

  2. 即使用戶是儘管我有我在上面index.gsp中的mentiond代碼,它應該改變佈局"login"註銷,/login/auth視圖是使用"main"佈局呈現。爲什麼?

在此先感謝!

+0

不確定如何最好地禁用默認的'/ login/auth'映射,而是將'/'映射到登錄頁面,你可以將這一行添加到'UrlMappings':'「/」(controller:「login 「,action:」auth「)'對於#2,默認的SpringSec'login/auth.gsp'視圖應用主佈局。 –

+0

@Andrew Addin UrlMappings對我沒有任何幫助。我更改了網址,但它並沒有將我重定向到索引。它仍然呈現/ login/auth/page。一切開始看起來像我必須改變LoginController ... – kmb

+0

最後,我刪除了額外的URL映射,我改變了auth.gsp。現在,它看起來像: 一切似乎運作良好,但我不能訪問$ {閃存。消息}在我的佈局,但也許我只是做錯了什麼。 – kmb

回答

3

/login/auth工作原因是UrlMappings中的"/$controller/$action?/$id?"映射。因此,所有控制器都自動映射。一個選擇是刪除這個,但這意味着你必須明確映射所有的控制器。這有好處,grails.org應用程序使用這種方法。

您不能取消映射自動映射的控制器,但可以將其重新映射到發送404的東西,而且這對用戶來說看起來是一樣的。一種方法是使用Grails過濾器,例如運行grails create-filters site,換上這SiteFilters.groovy

package com.foo.bar 

class SiteFilters { 

    def filters = { 
     loginUnmap(uri: '/login/**') { 
     before = { 
      response.status = 404 
      false 
     } 
     } 
    } 
} 

我不是100%肯定的佈局問題,但是我覺得現在的問題是,meta標籤被SiteMesh的特殊處理。解析頁面以確定要使用哪種佈局,然後將部分GSP合併到佈局中,因此使用像<g:if>這樣的運行時標籤不像您想要的那樣工作並不奇怪。

+0

佈局在插件實現內部定義爲auth.gsp文件 – kmb

+0

我指的是你的''標籤。我懷疑如果你查看源代碼,這兩個標籤都會在那裏,它會使用第一個標籤。 –

相關問題