[SPRING] Spring 보안은 보안 주석 구성에서 url 패턴을 제외합니다.
SPRINGSpring 보안은 보안 주석 구성에서 url 패턴을 제외합니다.
자바 보안 접근법을 사용하여 스프링 보안이 설정된 스프링 웹 애플리케이션을 가지고있다. 인증 (예 : 정적 리소스 등)에서 일부 URL 패턴을 제외하고 싶습니다. 나는 봄 보안 xml 설정으로이 일을 더 일찍 끝냈지 만 antmatchers를 추가하는 것이 도움이되지 않기 때문에 자바 설정으로 알아낼 수 없었다.
다음은 내 코드가 WebSecurityConfigurerAdapter를 확장하는 보안 구성 클래스에 추가 된 것입니다.
@Override
public void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/authFailure")
.permitAll()
.anyRequest()
.authenticated()
.and()
.httpBasic()
.and()
.authenticationProvider(_provider)
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.addFilter(authFilter())
.addFilterAfter(executionContextFilter(),
TokenBasedSecurityFilter.class).csrf().disable();
}
제가 사용하는 봄 보안 버전은 3.2.0입니다. 도와 주셔서 미리 감사드립니다.
편집하다:
제외 된 URL을 타면서 얻은 stacktrace,
org.springframework.security.authentication.AuthenticationServiceException: Authorization Header is not available in the request
at com.inventory.ricemill.tba.spring.TokenBasedSecurityFilter.doFilter(TokenBasedSecurityFilter.java:59)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:110)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:57)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:50)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:192)
at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:160)
at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:343)
at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:260)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:744)
Apr 01, 2014 10:18:41 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [Inventory] in context with path [/ricemill] threw exception [Request processing failed; nested exception is org.springframework.security.authentication.AuthenticationServiceException: Authorization Header is not available in the request] with root cause
org.springframework.security.authentication.AuthenticationServiceException: Authorization Header is not available in the request
at com.inventory.ricemill.tba.spring.TokenBasedSecurityFilter.doFilter(TokenBasedSecurityFilter.java:59)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:110)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:57)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:50)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:192)
at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:160)
at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:343)
at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:260)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:744)
이 요청은 봄 보안 필터 체인에 등록 된 필터를 통과하지만 antmatcher에서는 요청이 무시되어서는 안됩니다.
해결법
-
==============================
1.Github에 게시 된 Spring 보안 예제에서 해결책을 찾았습니다.
Github에 게시 된 Spring 보안 예제에서 해결책을 찾았습니다.
WebSecurityConfigurerAdapter에는 WebSecurity를 인수로 사용하는 오버로드 된 구성 메시지가 있습니다.이 메시지는 무시할 요청에서 ant matchers를 허용합니다.
@Override public void configure(WebSecurity web) throws Exception { web.ignoring().antMatchers("/authFailure"); }
자세한 내용은 스프링 보안 샘플을 참조하십시오.
-
==============================
2.인증 된 URL 패턴은 어디에 구성합니까? 나는 당신의 코드에서 하나의 URI 만 볼 수 있습니다.
인증 된 URL 패턴은 어디에 구성합니까? 나는 당신의 코드에서 하나의 URI 만 볼 수 있습니다.
여러 개의 configure (HttpSecurity) 메소드가 있거나 하나만 있습니까? 한 가지 방법으로 모든 URI가 필요해 보입니다.
나는 모든 것을 액세스하기 위해 인증을 요구하는 사이트를 가지고 있으므로 / *를 보호하려고합니다. 그러나 인증하기 위해서는 분명히 / 로그인을 보호하고 싶지 않습니다. 또한 액세스를 허용하려는 정적 자산 (로그인 페이지를 꽤 만들 수 있음)과 인증을 요구하지 않아야하는 상태 확인 페이지가 있습니다.
또한 / admin 사이트가 나머지 사이트보다 높은 권한을 요구하는 리소스를 가지고 있습니다.
다음은 나를 위해 일하고있다.
@Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/login**").permitAll() .antMatchers("/healthcheck**").permitAll() .antMatchers("/static/**").permitAll() .antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')") .antMatchers("/**").access("hasRole('ROLE_USER')") .and() .formLogin().loginPage("/login").failureUrl("/login?error") .usernameParameter("username").passwordParameter("password") .and() .logout().logoutSuccessUrl("/login?logout") .and() .exceptionHandling().accessDeniedPage("/403") .and() .csrf(); }
참고 : 이것은 첫 경기이기 때문에 주문을 가지고 경기해야 할 수도 있습니다. 예를 들어, 원래는 / ** 처음 :
.antMatchers("/**").access("hasRole('ROLE_USER')") .antMatchers("/login**").permitAll() .antMatchers("/healthcheck**").permitAll()
이로 인해 사이트는 / login에 대한 모든 요청을 / login으로 계속 리디렉션합니다. 마찬가지로 나는 / admin / ** last :
.antMatchers("/**").access("hasRole('ROLE_USER')") .antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')")
그 결과 내 권한이없는 테스트 사용자 "guest"가 관리 인터페이스 (yikes!)에 액세스 할 수있게되었습니다.
-
==============================
3.antMatchers를 추가한다고해서 도움이되지 않는다는 뜻입니까? antMatchers 정확히 어떻게 당신이 그것을 할 수 있습니다. 다음과 같은 것이 효과가 있습니다 (분명히 URL이 적절하게 변경됨).
antMatchers를 추가한다고해서 도움이되지 않는다는 뜻입니까? antMatchers 정확히 어떻게 당신이 그것을 할 수 있습니다. 다음과 같은 것이 효과가 있습니다 (분명히 URL이 적절하게 변경됨).
@Override public void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/authFailure").permitAll() .antMatchers("/resources/**").permitAll() .anyRequest().authenticated()
여전히 기쁨이 없다면 더 자세한 정보 / 스택 추적 등을 제공해야합니다.
Java 구성 스위치에 대한 XML의 세부 사항은 여기에 있습니다.
-
==============================
4.아래의 "authorizeRequests ()"앞에 "antMatcher"를 지정하면 "antMatcher"에 지정된 URL로만 인증이 제한됩니다.
아래의 "authorizeRequests ()"앞에 "antMatcher"를 지정하면 "antMatcher"에 지정된 URL로만 인증이 제한됩니다.
http.csrf (). disable () .antMatcher ( "/ apiurlneedsauth / **"). authorizeRequests ().
from https://stackoverflow.com/questions/22767205/spring-security-exclude-url-patterns-in-security-annotation-configurartion by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Spring 데이터 나머지 - 여러 속성별로 정렬 (0) | 2019.01.11 |
---|---|
[SPRING] 스프링 부트가 일괄 작업을 실행하는 방법 (0) | 2019.01.11 |
[SPRING] Spring-data-mongodb는 하나의 Mongo 인스턴스에서 여러 데이터베이스에 연결합니다. (0) | 2019.01.11 |
[SPRING] hbm.xml을 사용하는 대신 Hibernate 엔티티에 대한 패키지를 검사하는 방법은 무엇입니까? (0) | 2019.01.11 |
[SPRING] Spring MVC 컨트롤러가 클라이언트에게 파일을 보내도록 설정하기 (0) | 2019.01.11 |