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과부하가 걸린configuretake하는 메세지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 |