2014-02-12 5 views
3

Grails 애플리케이션에 Spring Security Core를 설치하고 s2-quickstart을 사용하여 설정합니다. '/'가 로그인 및 로그 아웃 작업을 처리하도록합니다. 로그인하지 않은 사용자는 루트 페이지 만 액세스 할 수 있다는 것을 의미합니다. 실제로 '/'를 제외한 모든 항목은 'ROLE_ADMIN'역할이없는 사용자에 대해서는 차단되어야합니다. 난 내 모든 컨트롤러에 @Secured(['ROLE_ADMIN'])을 설정하고 내의 index.gsp이 같은 추가Grails, Spring Security Core - 애플리케이션에서 제거/로그인/인증

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'] 
] 

:

<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> 

내가 Config.groovy 파일에서 로그인 루트 페이지에 양식을 설정하고 다음과 같은 구성을 추가

  1. 구성 법과 :

    두 가지 문제가 있습니다 ks를 예상했지만 브라우저에 입력 할 때 : localhost:8080/AdminPanel/login/auth 페이지가 여전히 존재하며 로그 아웃 한 사용자도 액세스 할 수 있습니다. 이 URL을 완전히 삭제하고 싶습니다. 로그인했거나 로그 아웃 한 사용자는 액세스 할 수 없어야합니다.

  2. 사용자가 내가 "login"에 레이아웃을 변경해야 내의 index.gsp에서 위의 mentiond 코드를 가지고 있다는 사실에도 불구하고, /login/auth보기, "main" 레이아웃을 사용하여 렌더링 로그 아웃 경우에도 마찬가지입니다. 왜?

미리 감사드립니다.

+0

기본'/ login/auth' 매핑을 비활성화하는 것이 가장 좋지만 로그인 페이지에'/'을 매핑하는 방법을 모르겠다면이 줄을'UrlMappings'에 추가하십시오 :''/ "(controller :"login ", action :"auth ")'# 2의 경우, 기본 SpringSec'login/auth.gsp'보기가 메인 레이아웃을 적용합니다. –

+0

@Andrew Addin UrlMappings이 나를 위해 아무 것도 변경하지 않았습니다. URL을 변경하지만 인덱스로 전혀 리디렉션되지 않습니다. 여전히/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 % 아니에요,하지만 난 문제가 메타 태그이 SiteMesh에 의해 특별히 처리되도록라고 생각합니다. 이 페이지는 어떤 레이아웃을 사용할 지 결정하기 위해 파싱됩니다. 그러면 GSP의 일부가 레이아웃에 병합되므로, <g:if>과 같은 런타임 태그를 사용하면 좋지 않을 수도 있습니다.

+0

레이아웃은 플러그인 구현 내에서 auth.gsp 파일 – kmb

+0

으로 정의되었습니다. 사용자의 ''태그를 참조하고있었습니다. 나는 당신이 소스를 볼 경우 두 태그가 거기에있을 것이며 첫 번째 태그를 사용할 것이라고 생각합니다. –

관련 문제