новая пользовательская страница входа на сервер авторизации

Я использую новый сервер авторизации Spring

      <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-oauth2-authorization-server</artifactId>
        <version>0.2.3</version>
    </dependency>

Я хочу настроить пользовательскую страницу входа. У меня настроено два bean-компонента

AuthorizationServerConfig.java

         @Bean
    @Order(Ordered.HIGHEST_PRECEDENCE)
    public SecurityFilterChain authorizationServerSecurityFilterChain(HttpSecurity http) throws Exception {
        OAuth2AuthorizationServerConfiguration.applyDefaultSecurity(http);

        return http.cors(Customizer.withDefaults())
                .formLogin()
                .and().build();
    }

SecurityConfig.java

       @Bean
    SecurityFilterChain defaultSecurityFilterChain(HttpSecurity http) throws Exception {
        http
                .cors(withDefaults())
                .authorizeRequests(authorizeRequests ->
                        authorizeRequests.mvcMatchers("/custom-login", "/css/**", "/js**", "/image/**").permitAll().anyRequest().authenticated()
                )
                .formLogin()
                .loginPage("/custom-login").failureForwardUrl("/custom-login?error");
        return http.build();
    }

Всякий раз, когда пользователь вводит неправильные учетные данные, не направляется/custom-login?errorОн направлен на/custom-login

мне кажется.failureForwardUrl("/custom-login?error");не работает

Если не использовать пользовательскую страницу входа, пользователь перенаправляется на/login?error=some-error

Может ли кто-нибудь помочь решить эту проблему?

1 ответ

Я решил проблему.

Я изменил конфигурацию на

AuthorizationServerCONfig.java

      @Bean
    @Order(Ordered.HIGHEST_PRECEDENCE)
    public SecurityFilterChain authorizationServerSecurityFilterChain(HttpSecurity http) throws Exception {
        OAuth2AuthorizationServerConfiguration.applyDefaultSecurity(http);

        return http
                .cors(Customizer.withDefaults())
                .formLogin().loginPage("/custom-login").failureForwardUrl("/custom-login?error=true")
                .and()
                .build();
    }

SecurityConfig.java

        @Bean
    SecurityFilterChain defaultSecurityFilterChain(HttpSecurity http) throws Exception {
        http
                .cors(withDefaults())
                .formLogin().failureForwardUrl("/custom-login")

        return http.build();
    }

Я добавил LoginController.java для обработки перенаправления пользовательского входа.

      @Controller
public class LoginController {
    @GetMapping("/custom-login")
    public String login() {
        return "login";
    }


    @PostMapping("/custom-login")
    public String loginFailed() {
        return "redirect:/authenticate?error=invalid username or password";
    }
}

Если вы не укажете эти конечные точки. вы будете перенаправлены на /login

Также у меня были оба

      <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-oauth2-resource-server</artifactId>
    </dependency>

И

      <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-oauth2-authorization-server</artifactId>
            <version>0.2.3</version>
        </dependency>

Мой сервис был и сервером авторизации, и сервером ресурсов одновременно. Поэтому я удалил

        <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-oauth2-resource-server</artifactId>
        </dependency>

И все работает ожидаемо

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