두 손끝의 창조자

[Spring-Security]Java Configuration use-expressions="false" 본문

Spring

[Spring-Security]Java Configuration use-expressions="false"

codinglog 2020. 7. 22. 14:53

시스템이 초기화되면서 AccessDecisionManager에 등록된 Voter가 Configuration에서 설정한 속성을 지원하는지 검사하도록 되어있다.

같은 코드임에도 불구하고 XML로 정의하면 정상동작하고, Java Config로 정의하면 실패했다.

@Override
public boolean supports(ConfigAttribute attribute) {
    return attributes.contains(attribute.getAttribute());
}

XML로 정의할 때 use-expressions="false" 로 넣어주면 attribute.getAttribute()로 access 에 넣었던 값, 또는 표현식을 가져올 수 있었는데 Java Configuration에서는 null 이 리턴되었다. use-expressions="false" 옵션을 주면 SecuriyConfig 타입으로 ConfigAttribute를 가져오고 "true" 이면 WebExpressionConfigAttribute 타입으로 생성된다.(org.springframework.security.config.http.FilterInvocationSecurityMetadataSourceParser.createSecurityMetadataSource())

그런데 Annotaion 기반으로 만들어진 Java Configuration에서는 WebExpressionConfigAttribute로 만들어지도록 기본으로 세팅되어 있다..getAttribute()를 호출하면 null을 리턴하도록 되어있기 때문에 attribute.getAttribute() 의 결과가 null이 되었다.

그러면 java configuation 방식으로 use-expression 을 false 로 어떻게 할까?

protected void configure(HttpSecurity http) throws Exception {
   	http.apply(new UrlAuthorizationConfigurer<HttpSecurity>()).getRegistry()
   			.mvcMatchers("/api/**").access("vote");
   }

 

그런데 이렇게 하는것 보다 Voter에서 attribute.toString()으로 값을 가져오는게 나은것 같다.

Voter에서 WebExpressionConfigAttribute로 캐스팅해서 값을 가져오고 싶어도 package-private 이라 어차피 못 가져오고 환경에 따라서 코드도 달라져야하기 때문이다.

 

반응형
Comments