Пользовательский обработчик успеха для OncePerRequestFilter - PullRequest
1 голос
/ 09 мая 2020

Я создаю простое приложение 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);

    }

Аутентификация для моего приложения работает нормально, но пользовательский обработчик успеха входа не срабатывает. Я думаю, причина этого в том, что я использовал собственный класс фильтра для аутентификации. Кто-нибудь, пожалуйста, помогите мне найти способ настройки пользовательского обработчика успеха.

Заранее спасибо.

...