2010-01-26 2 views
0

Spring Security (AKA Acegi) 플러그인이 제공하는 주석을 사용하고 있습니다.Grails Acegi 플러그인 주석

주석이 달린 제어기 작업이 관리자 및 일반 사용자에게 제공되어야 함을 나타냅니다. 하지만 지금은 관리자와 등록되지 않은 사용자가 사용할 수있는 작업임을 나타낼 필요가 있습니다. 주석을 사용하여 역할이없는 사용자, 즉 등록되지 않은 사용자를 나타낼 수 있습니까?

감사합니다, 돈

답변

2

사용하십시오 쿠키로 로그인하지 않았거나 ROLE_ADMIN을 가지고 있습니다.

package com.burtbeckwith.grails.springsecurity 

import org.springframework.security.Authentication 
import org.springframework.security.AuthenticationTrustResolverImpl 
import org.springframework.security.ConfigAttribute 
import org.springframework.security.ConfigAttributeDefinition 
import org.springframework.security.vote.AccessDecisionVoter 

class NotLoggedInVoter implements AccessDecisionVoter { 

    private authenticationTrustResolver = new AuthenticationTrustResolverImpl() 

    int vote(Authentication authentication, object, ConfigAttributeDefinition config) { 
     for (configAttribute in config.configAttributes) { 
     if (supports(configAttribute)) { 
      if (authenticationTrustResolver.isAnonymous(authentication)) { 
       // allowed if not logged in 
       return ACCESS_GRANTED 
      } 
      for (authority in authentication.authorities) { 
       if ('ROLE_ADMIN' == authority.authority) { 
        // allowed if logged in as an admin 
        return ACCESS_GRANTED 
       } 
      } 
     } 
     } 

     return ACCESS_DENIED 
    } 

    boolean supports(ConfigAttribute attribute) { 
     'IS_NOT_AUTHENTICATED' == attribute?.attribute 
    } 

    boolean supports(Class clazz) { 
     true 
    } 
} 

등록이 resources.groovy에서 빈으로 :

beans = { 
    notLoggedInVoter(com.burtbeckwith.grails.springsecurity.NotLoggedInVoter) 
} 

및 SecurityConfig.groovy에서 유권자 목록에 의한에 추가 새 'IS_NOT_AUTHENTICATED'토큰을 처리하는 사용자 정의 유권자 필요 이 당신의 컨트롤러 액션을

decisionVoterNames = ['notLoggedInVoter', 'authenticatedVoter', 'roleVoter'] 

및 주석 : 다음 'decisionVoterNames'속성을 설정

@Secured(['IS_NOT_AUTHENTICATED']) 

이며 ROLE_ADMIN 인 인증되지 않은 사용자와 인증 된 사용자 만 허용합니다.

+1

IS_NOT_AUTHENTICATED의 의미를 (admin 또는 not authenticaed)에서 단순히 (인증되지 않은) 것으로 변경하는 것이 디자인의 관점에서 더 좋을 것이라고 생각합니다. 아마도이 토큰을 ROLE_ 토큰의 조합과 결합 할 수 있습니다. 아마도이 변경은 'NotLoggedInVoter.vote'의 마지막'for '루프를 제거함으로써 이루어질 수 있습니다. –

+0

그건 그렇고, 나는이 수준의 도움을 기대하지 않았습니다. –

2

그의 토큰의 여부를 기록 여부를 사람을 의미 IS_AUTHENTICATED_ANONYMOUSLY이다. IS_AUTHENTICATED_REMEMBERED는 remember-me 쿠키 또는 명시 적 로그인을 사용하여 로그인 한 모든 사용자를 의미하며 IS_AUTHENTICATED_FULLY는 쿠키를 사용하지 않고 명시 적 로그인을 통해 로그인했음을 의미합니다. 당신이

@Secured(['IS_AUTHENTICATED_ANONYMOUSLY']) 

와 액션에 주석을 경우

그것은 사람이 해당 작업에 액세스 할 수 있습니다. 사용자가있는 경우에도 관리자가 전용 그러나 사용자 이름/암호 로그인을 강제 할 수 있도록 예를 들어, 그래서 당신은 역할과 이러한 특수 토큰을 결합 할 수있는 기억 - 내가 당신이 여기에서 필요로하는 솔루션이다

@Secured(['ROLE_ADMIN', 'IS_AUTHENTICATED_FULLY']) 
+0

응답 해 주셔서 감사합니다. 어노테이션을 사용하여 표현하고자하는 것은 "로그인 여부"가 아닌 "로그인하지 않음"입니다. –