일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- wildfly
- jetbrains
- MySQL
- log4j2
- nginx
- mybatis
- kubectl
- NCP
- Git
- Windows
- gradle
- tibero
- JPA
- dbeaver
- database
- VSCode
- BPMN
- useEffect
- IntelliJ
- nodejs
- intellijIDEA
- Spring
- JavaScript
- springboot
- gson
- Kubernetes
- docker
- LOG4J
- Java
- react
- Today
- Total
두 손끝의 창조자
[Spring-Security]Java Configuration use-expressions="false" 본문
시스템이 초기화되면서 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 이라 어차피 못 가져오고 환경에 따라서 코드도 달라져야하기 때문이다.