Механизмы множественного входа в Spring Security 6

До обновления с Spring Security 5.3.24 я мог динамически настраивать несколько решений для входа в HttpSecurity, таких как saml2Login, и два formLogin с разными конфигурациями loginProcessingUrl, например

      (httpSecurity
                                       .authorizeRequests()
                                   .antMatchers("/index.html","/static/**").permitAll()
                                       .anyRequest().authenticated()
                                       .and()
                                       .exceptionHandling()
                                       .defaultAuthenticationEntryPointFor(
                                          loginUrlauthenticationEntryPoint(),
                                          new AntPathRequestMatcher("/**"))
                                       .and());

с последующим

       .saml2Login(saml2 -> saml2
                            .relyingPartyRegistrationRepository(relyingPartyRegistrationRepository)
                            .successHandler(authenticationSuccessHandler));

и

       .formLogin(form -> form
                           .loginPage("/index.html")
                           .loginProcessingUrl("/app/internal/login" + "/**").permitAll()
                           .successHandler(authenticationSuccessHandler)
                           .failureHandler(new AuthenticationFailureHandler() {

И все это сработало, предоставляя URL-адреса для всех методов входа в систему. Обновление Spring Security 6 (6.1.3) больше не работает. Была ли удалена эта функция или существует какой-то другой способ настройки нескольких способов входа в систему с отдельными URL-адресами для их обработки?

1 ответ

Я думаю, что проблемы, с которыми вы столкнулись, - это устаревшие методы, и, чтобы быть уверенным, что это проблема, я рекомендую вам переписатьsecurityFilterChainчто-то вроде этого:

      @Bean
  public SecurityFilterChain securityFilterChain(HttpSecurity httpSecurity) throws Exception {
    httpSecurity
        .authorizeHttpRequests(request -> {
          request.requestMatchers("/index.html","/static/**").permitAll()
              .anyRequest().authenticated();
        });

    httpSecurity.exceptionHandling(exceptionH -> {
          exceptionH.defaultAuthenticationEntryPointFor(
              loginUrlauthenticationEntryPoint(),
              new AntPathRequestMatcher("/**"));
        });
    httpSecurity.saml2Login(saml2 -> saml2
        .relyingPartyRegistrationRepository(relyingPartyRegistrationRepository)
        .successHandler(authenticationSuccessHandler));
    httpSecurity.formLogin(form -> form
        .loginPage("/index.html")
        .loginProcessingUrl("/app/internal/login/**").permitAll()
        .successHandler(authenticationSuccessHandler)
        .failureHandler(new AuthenticationFailureHandler()));

    return httpSecurity.build();
  }

Если это также не поможет, вам следует создать два экземпляраsecurityFilter @Beanхороший пример того, как это сделать, вы можете найти здесь ответ на этот вопрос , получивший наибольшее количество голосов.

Также вам необходимо проверить Руководство по миграции

Другие вопросы по тегам