2 ответа

  1. Вы должны реализовать пользовательскую аутентификацию и сделать так, как описано в публикации выше.

    Редактировать:
    В программе CustomAuthenticationProvider необходимо вернуть объект пользовательской проверки подлинности.
    Вы можете добиться этого, реализуя свой класс, который реализует интерфейс аутентификации.

  2. 1.Вы можете создать пользовательский фильтр CustomUsernamePasswordAuthenticationfilter, он будет выглядеть примерно так:

    public class CustomUsernamePasswordAuthenticationFilter extends UsernamePasswordAuthenticationFilter{
    
        @Override
        public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException {
            final String languageParam = request.getParameter("language");
            request.getSession().setAttribute("language", languageParam);
            System.out.println("Filter" + languageParam);
            // You can do your stuff here
            return super.attemptAuthentication(request, response); 
        } 
    }
    

    2.В security config создайте компонент для настраиваемого фильтра

    @Bean
    public UsernamePasswordAuthenticationFilter authenticationFilter() {
        CustomUsernamePasswordAuthenticationFilter authFilter = new CustomUsernamePasswordAuthenticationFilter();
        List<AuthenticationProvider> authenticationProviderList = new ArrayList<AuthenticationProvider>();
        authenticationProviderList.add(authenticationProvider);
        AuthenticationManager authenticationManager = new ProviderManager(authenticationProviderList);
        authFilter.setAuthenticationManager(authenticationManager);
        authFilter.setUsernameParameter("username");
        authFilter.setPasswordParameter("password");
        return authFilter;
    }
    

    3.В security config настройте addFilter для http, это будет что-то вроде этого

    @Override
    protected void configure(HttpSecurity http) throws Exception {
    
      http.authorizeRequests()
        .antMatchers("/").permitAll()
        .antMatchers("/home").access("hasRole('ROLE_USER')")
        .antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')")
        .antMatchers("/api/**").access("hasRole('ROLE_ADMIN') or hasRole('ROLE_API')")
        .and()
        .formLogin()
        .loginProcessingUrl("/login")
        .loginPage("/loginPage")
        .failureUrl("/loginPage?error")
        .defaultSuccessUrl("/home")
        .usernameParameter("username")
        .passwordParameter("password")
        .and()
        .exceptionHandling()
        .accessDeniedPage("/Access_Denied").and()
        .addFilterBefore(authenticationFilter(), UsernamePasswordAuthenticationFilter.class);
    
    
    }
    

    Если вы хотите, чтобы эти дополнительные значения в контроллере, вы можете добавить HttpServletRequest параметр запроса и получить значения из сеанса, как это.

    request.getSession().getAttribute("language");