Я создаю простое приложение Spring Security с аутентификацией JWT. Аутентификация работает нормально. Но мой пользовательский SuccessHandler не запускается, так как обработчик успеха моего пользовательского фильтра переопределяет.
@Component
public class JwtFilter extends OncePerRequestFilter {
@Autowired
private JwtProvider jwtProvider;
@Autowired
private UserService userService;
@Autowired
private MyUserDetailsService myUserDetailService;
@Override
protected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, FilterChain filterChain) throws ServletException, IOException {
String jwt = getToken(httpServletRequest);
if (jwt != null && jwtProvider.validate(jwt)) {
try {
String userAccount = jwtProvider.getUserAccount(jwt);
UserDetails userDetails = myUserDetailService.loadUserByUsername(userAccount);
UsernamePasswordAuthenticationToken auth
= new UsernamePasswordAuthenticationToken(userAccount, null, userDetails.getAuthorities());
SecurityContextHolder.getContext().setAuthentication(auth);
} catch (Exception e) {
SecurityContextHolder.clearContext();
logger.error("Set Authentication from JWT failed");
}
}
filterChain.doFilter(httpServletRequest, httpServletResponse);
}
private String getToken(HttpServletRequest request) {
String authHeader = request.getHeader("Authorization");
if (authHeader != null && authHeader.startsWith("Bearer ")) {
return authHeader.replace("Bearer ", "");
}
return null;
}
}
Мой класс конфигурации
@Autowired
private MyUserDetailsService userDetailsService;
@Autowired
private MySimpleUrlAuthenticationSuccessHandler myAuthenticationSuccessHandler;
@Autowired
private MyLogoutSuccessHandler myLogoutSuccessHandler;
@Autowired
private AuthenticationFailureHandler authenticationFailureHandler;
@Autowired
private CustomWebAuthenticationDetailsSource authenticationDetailsSource;
@Autowired
JwtFilter jwtFilter;
@Autowired
private JwtEntryPoint accessDenyHandler;
@Override
protected void configure(final HttpSecurity http) throws Exception {
// @formatter:off
http
.cors().and()
.csrf().disable()
.authorizeRequests()
.antMatchers("/users/getUsers/**").access("hasAnyRole('TESTER')")
.antMatchers("/product/**").authenticated()
.antMatchers("/cart/**").access("hasAnyRole('CUSTOMER')")
.antMatchers("/order/finish/**").access("hasAnyRole('EMPLOYEE', 'MANAGER')")
.antMatchers("/order/**").authenticated()
.antMatchers("/profiles/**").authenticated()
.antMatchers("/seller/product/new").access("hasAnyRole('MANAGER')")
.antMatchers("/seller/**/delete").access("hasAnyRole( 'MANAGER')")
.antMatchers("/seller/**").access("hasAnyRole('EMPLOYEE', 'MANAGER')")
.anyRequest().permitAll()
.and()
.exceptionHandling().authenticationEntryPoint(accessDenyHandler)
.and()
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.userDetailsService(userDetailsService)
.formLogin()
.successHandler(myAuthenticationSuccessHandler)
.failureHandler(authenticationFailureHandler)
.authenticationDetailsSource(authenticationDetailsSource)
.permitAll()
.and()
.logout()
.logoutSuccessHandler(myLogoutSuccessHandler)
.invalidateHttpSession(false)
.permitAll();
http.addFilterBefore(jwtFilter, UsernamePasswordAuthenticationFilter.class);
http.formLogin().successHandler(myAuthenticationSuccessHandler);
http.formLogin().failureHandler(authenticationFailureHandler);
}
Аутентификация для моего приложения работает нормально, но пользовательский обработчик успеха входа не срабатывает. Я думаю, причина этого в том, что я использовал собственный класс фильтра для аутентификации. Кто-нибудь, пожалуйста, помогите мне найти способ настройки пользовательского обработчика успеха.
Заранее спасибо.