|
|
|
@ -1,5 +1,5 @@ |
|
|
|
/* |
|
|
|
/* |
|
|
|
* Copyright 2002-2019 the original author or authors. |
|
|
|
* Copyright 2002-2022 the original author or authors. |
|
|
|
* |
|
|
|
* |
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
|
|
|
* you may not use this file except in compliance with the License. |
|
|
|
* you may not use this file except in compliance with the License. |
|
|
|
@ -32,6 +32,7 @@ import org.springframework.security.core.Authentication; |
|
|
|
import org.springframework.security.core.AuthenticationException; |
|
|
|
import org.springframework.security.core.AuthenticationException; |
|
|
|
import org.springframework.security.core.context.SecurityContext; |
|
|
|
import org.springframework.security.core.context.SecurityContext; |
|
|
|
import org.springframework.security.core.context.SecurityContextHolder; |
|
|
|
import org.springframework.security.core.context.SecurityContextHolder; |
|
|
|
|
|
|
|
import org.springframework.security.core.context.SecurityContextHolderStrategy; |
|
|
|
import org.springframework.security.web.context.NullSecurityContextRepository; |
|
|
|
import org.springframework.security.web.context.NullSecurityContextRepository; |
|
|
|
import org.springframework.security.web.context.SecurityContextRepository; |
|
|
|
import org.springframework.security.web.context.SecurityContextRepository; |
|
|
|
import org.springframework.security.web.util.matcher.AnyRequestMatcher; |
|
|
|
import org.springframework.security.web.util.matcher.AnyRequestMatcher; |
|
|
|
@ -67,6 +68,9 @@ import org.springframework.web.filter.OncePerRequestFilter; |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
public class AuthenticationFilter extends OncePerRequestFilter { |
|
|
|
public class AuthenticationFilter extends OncePerRequestFilter { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private SecurityContextHolderStrategy securityContextHolderStrategy = SecurityContextHolder |
|
|
|
|
|
|
|
.getContextHolderStrategy(); |
|
|
|
|
|
|
|
|
|
|
|
private RequestMatcher requestMatcher = AnyRequestMatcher.INSTANCE; |
|
|
|
private RequestMatcher requestMatcher = AnyRequestMatcher.INSTANCE; |
|
|
|
|
|
|
|
|
|
|
|
private AuthenticationConverter authenticationConverter; |
|
|
|
private AuthenticationConverter authenticationConverter; |
|
|
|
@ -151,6 +155,17 @@ public class AuthenticationFilter extends OncePerRequestFilter { |
|
|
|
this.securityContextRepository = securityContextRepository; |
|
|
|
this.securityContextRepository = securityContextRepository; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
|
|
* Sets the {@link SecurityContextHolderStrategy} to use. The default action is to use |
|
|
|
|
|
|
|
* the {@link SecurityContextHolderStrategy} stored in {@link SecurityContextHolder}. |
|
|
|
|
|
|
|
* |
|
|
|
|
|
|
|
* @since 5.8 |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
public void setSecurityContextHolderStrategy(SecurityContextHolderStrategy securityContextHolderStrategy) { |
|
|
|
|
|
|
|
Assert.notNull(securityContextHolderStrategy, "securityContextHolderStrategy cannot be null"); |
|
|
|
|
|
|
|
this.securityContextHolderStrategy = securityContextHolderStrategy; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) |
|
|
|
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) |
|
|
|
throws ServletException, IOException { |
|
|
|
throws ServletException, IOException { |
|
|
|
@ -180,15 +195,15 @@ public class AuthenticationFilter extends OncePerRequestFilter { |
|
|
|
|
|
|
|
|
|
|
|
private void unsuccessfulAuthentication(HttpServletRequest request, HttpServletResponse response, |
|
|
|
private void unsuccessfulAuthentication(HttpServletRequest request, HttpServletResponse response, |
|
|
|
AuthenticationException failed) throws IOException, ServletException { |
|
|
|
AuthenticationException failed) throws IOException, ServletException { |
|
|
|
SecurityContextHolder.clearContext(); |
|
|
|
this.securityContextHolderStrategy.clearContext(); |
|
|
|
this.failureHandler.onAuthenticationFailure(request, response, failed); |
|
|
|
this.failureHandler.onAuthenticationFailure(request, response, failed); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain, |
|
|
|
private void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain, |
|
|
|
Authentication authentication) throws IOException, ServletException { |
|
|
|
Authentication authentication) throws IOException, ServletException { |
|
|
|
SecurityContext context = SecurityContextHolder.createEmptyContext(); |
|
|
|
SecurityContext context = this.securityContextHolderStrategy.createEmptyContext(); |
|
|
|
context.setAuthentication(authentication); |
|
|
|
context.setAuthentication(authentication); |
|
|
|
SecurityContextHolder.setContext(context); |
|
|
|
this.securityContextHolderStrategy.setContext(context); |
|
|
|
this.securityContextRepository.saveContext(context, request, response); |
|
|
|
this.securityContextRepository.saveContext(context, request, response); |
|
|
|
this.successHandler.onAuthenticationSuccess(request, response, chain, authentication); |
|
|
|
this.successHandler.onAuthenticationSuccess(request, response, chain, authentication); |
|
|
|
} |
|
|
|
} |
|
|
|
|