복붙노트

[SPRING] Spring 보안은 보안 주석 구성에서 url 패턴을 제외합니다.

SPRING

Spring 보안은 보안 주석 구성에서 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. ==============================

    1.Github에 게시 된 Spring 보안 예제에서 해결책을 찾았습니다.

    Github에 게시 된 Spring 보안 예제에서 해결책을 찾았습니다.

    WebSecurityConfigurerAdapter에는 WebSecurity를 ​​인수로 사용하는 오버로드 된 구성 메시지가 있습니다.이 메시지는 무시할 요청에서 ant matchers를 허용합니다.

    @Override
    public void configure(WebSecurity web) throws Exception {
        web.ignoring().antMatchers("/authFailure");
    }
    

    자세한 내용은 스프링 보안 샘플을 참조하십시오.

  2. ==============================

    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. ==============================

    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. ==============================

    4.아래의 "authorizeRequests ()"앞에 "antMatcher"를 지정하면 "antMatcher"에 지정된 URL로만 인증이 제한됩니다.

    아래의 "authorizeRequests ()"앞에 "antMatcher"를 지정하면 "antMatcher"에 지정된 URL로만 인증이 제한됩니다.

    http.csrf (). disable ()         .antMatcher ( "/ apiurlneedsauth / **"). authorizeRequests ().

  5. from https://stackoverflow.com/questions/22767205/spring-security-exclude-url-patterns-in-security-annotation-configurartion by cc-by-sa and MIT license