2014-05-08 9 views
0

나는 역할 벌금을 인식, 또는 (예상대로) 사용자가 역할을하지 않은 경우 거부 할 것 @Secured 표기@PreAuthorize가보고있는 역할을 어떻게 확인할 수 있습니까?

@Secured("Role_Admin") 
public void dummyMethod(HttpServletRequest request) ... 

로 고정 내가 처음에했던 일부 봄 컨트롤러 방법을 가지고있다. 그러나 @PreAuthorize 주석을 사용하기 위해 전환을 시도했지만 지금은 모든 것이 거부되었습니다. 나는 @PreAuthorize 주석을 제거하고, 뭔가를 할 경우

@PreAuthorize("hasRole('Role_Admin')") 
public void dummyMethod(HttpServletRequest request) ... 

는, true를 돌려줍니다

request.isUserInRole("Role_Admin") 

을 말한다. 주석에 남겨두고 액세스 거부 처리기에서 사용자의 역할 을 확인하면 사용자에게 'Role_Admin'권한이 부여 된 것을 볼 수 있습니다.

@PreAuthorize 뒤에있는 코드가 어떤 역할/권한을 갖고 있는지 확인하지 못했습니다. 아무도 봄 보안 강좌를 확인할 수 있습니까?

내가 모든 것을 구성하는 자바를 사용하고

편집 할 수 있습니다. 그래서 다음과 같습니다 내 AccessDeniedHandler을 발로하지 있기 때문에 아래의 대답에 내 대답에

@Configuration 
@EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true) 
public class SecurityConfigurator extends GlobalMethodSecurityConfiguration { ... 

, 나는 @Secured로 전환하고 있습니다 이유입니다. 내가 그렇게하도록 강요 할 수 있다면, 나는 그것에 충실 할 것이다. @PreAuthorize가 핸들러를 시작합니다.

EDIT2

같이, 안드레이 지적 내 구성이 정의했습니다. 그것은 변화를 가져 오지 않았습니다.

@Bean 
public SimpleMappingExceptionResolver resolver() { 
    SimpleMappingExceptionResolver resolver = new SimpleMappingExceptionResolver(); 

    resolver.setExcludedExceptions(AccessDeniedException.class); 

    Properties mappings = new Properties(); 
    mappings.put("org.springframework.web.servlet.PageNotFound", "p404"); 
    mappings.put("org.springframework.dao.DataAccessException", "dataAccessFailure"); 
    mappings.put("org.springframework.transaction.TransactionException", "dataAccessFailure"); 

    resolver.setExceptionMappings(mappings); 

    return resolver; 
} 
+0

보안 구성 XML을 게시 할 수 있습니까? –

+1

아마, [이 SO 게시물] (http://stackoverflow.com/questions/21171882/spring-security-ignoring-access-denied-handler-with-method-level-security)를 보았지만 나는 그것을 나눠 줘. –

+0

톱. 내 구성에 뭔가 추가하려고했지만 ExceptionHandler는 여전히 AccessDeniedHandler 대신 예외를 가져옵니다. 질문에 구성을 추가하는 중입니다. – pChip

답변

0

@Secured 반대로 @PreAuthorize를 사용하고 싶은거야? 난 당신이 표현을 사용하도록 HTTP 보안을 설정하지 않았기 때문에 당신의 @PreAuthorize가 실패 상상 : 당신이 그때 당신이 사용하는 버전이 문제가되지 않습니다 할 경우

<http use-expressions="true"> 

나는 상상한다. 나는 그 사람이 @Secured을 선호하는 방법이라고 말하면서 그 사람이 @PreAuthorize 또는 그와 같은 몇 가지 이유보다 새로운 버전이기 때문에 Spring 개발자 중 한 명을 기억하는 것 같습니다. 나는 @Secured이 더 독립적이며 많은 스프링 구성 요소와 상호 작용하지 않는다고 생각합니다. 이것이 작동하지 않으면 알려주십시오.

+0

보안 주석을 사용할 때 액세스 거부 예외는 AccessDeniedHandler에 의해 선택되지 않습니다. PreAuthorize 주석은 핸들러에 전달을 보냅니다. AccessDeniedHandler를 시작하기 위해 Secure 주석을 얻을 수 있다면 이상적입니다. 내가 시도한 것은 아무것도 없었다. 질문에 내 구성을 게시 할 것입니다. – pChip

+0

아, 그래.저는 90 % 확신합니다. 사용자가'@Secured'로 실패하면'AccessDeniedHandler'를 건드리지 않고 브라우저에 401을 돌려줍니다. 만약 pre 또는 post 핸들 인증 이벤트를 가로 채고 싶다면,'HandlerInterceptorAdapter'를 확장하십시오. – JamesENL

관련 문제