Spring Security에서 보안 주석 구성에서 URL 패턴 제외
java config approach를 사용하여 spring security를 구성한 spring web application을 가지고 있습니다.인증에서 몇 가지 URL 패턴(예: 정적 리소스 등)을 제외하고 싶습니다.spring security xml config로 이것을 더 일찍 해보았지만 antmatchers를 추가하는 것이 도움이 되지 않아 java config로 알아낼 수 없었습니다.다음은 보안 구성 클래스 확장에 추가된 나의 코드입니다.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();
}
제가 사용하는 Spring Security 버전은 3.2.0입니다.
편집:
제외된 URL을 치며 얻은 스택 트레이스,
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)
요청은 스프링 보안 필터 체인에 등록된 필터를 통과하지만 요청이 앤트매처와 함께 무시되므로 통과되지 않습니다.
Github에 게시된 Spring 보안 예제에서 솔루션을 찾았습니다.
WebSecurityConfigurerAdapter
과부하가 걸린configure
take하는 메세지WebSecurity
무시할 요청에 대한 개미 일치를 수용하는 논쟁으로서.
@Override
public void configure(WebSecurity web) throws Exception {
web.ignoring().antMatchers("/authFailure");
}
자세한 내용은 스프링 보안 샘플 참조
인증된 URL 패턴을 구성하는 위치가 어디입니까?당신 코드에 uri가 하나밖에 안 보이네요.
구성(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/**도 마지막으로 사용했습니다.
.antMatchers("/**").access("hasRole('ROLE_USER')")
.antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')")
이로 인해 내 권한 없는 테스트 사용자 "손님"이 관리 인터페이스에 액세스할 수 있게 되었습니다(예!).
개미매처스를 추가하는 것이 도움이 되지 않는다는 것은 무엇을 의미합니까? 개미매처스는 정확히 당신이 하는 방법입니다.다음과 같은 것이 작동해야 합니다(분명히 URL을 적절하게 변경).
@Override
public void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/authFailure").permitAll()
.antMatchers("/resources/**").permitAll()
.anyRequest().authenticated()
여전히 기쁨을 느끼지 못하는 경우에는 더 많은 세부 정보/적층 추적 등을 제공해야 합니다.
XML-Java config switch에 대한 자세한 내용은 여기에 있습니다.
아래와 같이 "authorizeRequests()" 이전에 "antMatcher"를 지정하면 인증이 "antMatcher"에 지정된 URL로만 제한됩니다.
http.csrf(.disable() .antMatcher("/apurl needsauth/**".authorizeRequests().
여기에 이미 제시된 답변을 추가합니다.
인증과 허가의 차이에 대한 혼란이 많은 것 같습니다.
Spring Security는 인증을 먼저 실행하고, 인증을 실행한 다음에 인증을 실행합니다.
즉, 인증 필터를 먼저 실행하고 인증된 엔드포인트를 확인한 후 그 후에만 인증된 엔드포인트를 확인합니다.
사용자 지정 인증 필터를 피하려면,permitAll
인증이 아닌 인증과 관련된 것이므로 작동하지 않습니다.
Spring Security 5.7.0-M2는 더 이상 사용하지 않습니다.WebSecurityConfigurerAdapter
.
인증 필터는 다음을 사용하여 무시할 수 있습니다.
@Bean
public WebSecurityCustomizer ignoringCustomizer() {
return (web) -> web.ignoring().requestMatchers("/ignore1", "/ignore2");
}
아니면 개미매처스를 이용해서.
그리고 좀 더 현대적인 방식으로 보면 다음과 같습니다.
@Bean
public WebSecurityCustomizer webSecurityCustomizer() {
return (web) -> web.ignoring().antMatchers("/authFailure");
}
위의 모든 해결책들이 구식이라는 것을 발견했습니다...이것이 제가 해결한 해결책입니다.
@Configuration
@EnableWebSecurity/*(debug = true)*/
@RequiredArgsConstructor
@EnableMethodSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
// @formatter:off
return http
.csrf()
.disable()
.headers().frameOptions().disable()
.and()
// Enable CORS at Spring Security level
.cors()
.and()
.authorizeHttpRequests()
.requestMatchers("/login/**", "/api/noAuth/**")
.permitAll()
.anyRequest()
.authenticated()
.and()
.oauth2ResourceServer()
.jwt()
.jwtAuthenticationConverter(new CustomJwtAuthenticationConverter(new UserDetailsConverter()))
.and()
.and().build();
// @formatter:on
}
}
언급URL : https://stackoverflow.com/questions/22767205/spring-security-exclude-url-patterns-in-security-annotation-configurartion
'programing' 카테고리의 다른 글
powershell: invoke-sqlcmd에 의한 오류 원인을 잡는 방법? (0) | 2023.11.01 |
---|---|
CSS를 사용하면 캔버스가 늘어나지만 '너비'와 '높이' 속성은 정상입니다. (0) | 2023.11.01 |
우커머스는 가격을 계산하고 절약합니다. (0) | 2023.11.01 |
LISTAGG 윈도잉 절과 동등함 (0) | 2023.11.01 |
한 사용자가 수정한 모든 파일을 알려줄 수 있습니까? (0) | 2023.11.01 |