Как указать две разные формы входа для двух разных URL-адресов в Spring Security? - PullRequest
0 голосов
/ 28 января 2020

У меня относительно сложная конфигурация защиты пружины, как показано ниже. Я пытаюсь добиться следующего:

запросы к /passport/** будут аутентифицированы, с альтернативой formLogin() ("/passport/login"). Это отличается от стандартного formLogin, который разрешается в ("/login")

Обе формы будут использовать один и тот же механизм аутентификации (или очень похожи за кулисами).

На данный момент запросы /passport/123 et c. так или иначе являются «открытыми» и не прошедшими проверку подлинности, в то время как их нужно перенаправить на /passport/login. Кто-нибудь может увидеть, что я делаю неправильно или как лучше всего этого добиться?

Во многих документах, которые я читал в Интернете, предлагается использовать два разных класса конфигурации , тогда как у меня есть один, но logi c для входа будет аналогичным. Принимая во внимание, что есть также достаточно много других битов, которые нужно будет реплицировать, если это вообще возможно, я хотел бы иметь только одну конфигурацию.

 http

     .antMatcher( "/passport/**" )
     .authorizeRequests().and()
        .formLogin().loginPage( "/passport/login" )
        .successHandler( authSuccessHandler() )
        .failureHandler( authFailureHandler() )
     .and()
      .antMatcher( "/**" )
         .authorizeRequests()
           .antMatchers( HttpMethod.OPTIONS, "/" ).permitAll()
           .antMatchers( HttpMethod.GET, "/app/**" ).permitAll()
           .antMatchers( LOGIN_DESTINATION + "**" ).permitAll()
           .anyRequest().authenticated()
           .and()
           .oauth2Login()
              .loginPage( LOGIN_DESTINATION )
              .authorizationEndpoint()
                  .baseUri( "/oauth2/authorize" )
                  .authorizationRequestRepository( cookieAuthorizationRequestRepository() )
                  .and()
              .redirectionEndpoint()
                  .baseUri( "/oauth2/callback/*" )
                  .and()
              .userInfoEndpoint()
                  .userService( customOAuth2UserService )
                  .and()
           .successHandler( oAuth2AuthenticationSuccessHandler )
           .failureHandler( oAuth2AuthenticationFailureHandler )
           .and()
       .formLogin()
          .loginPage( "/login" )
          .successHandler( authSuccessHandler() )
          .failureHandler( authFailureHandler() )
          .and()
      .logout()
         .logoutUrl( "/logout" )
         .logoutSuccessUrl( "/" )
         .deleteCookies( "cookieLogin" )
         .logoutSuccessHandler( ( httpServletRequest, httpServletResponse, authentication ) -> {
            httpServletResponse.setStatus( HttpServletResponse.SC_OK );
         } )
      .and()
      .rememberMe()
         .rememberMeServices( new RememberMeServices( loginService, tokenService ) )
         .key( TokenService.HASH_SECRET )
         .and()

.csrf()
            .csrfTokenRepository( new CsrfTokenRepository( tokenService ) )
            .and()



      .sessionManagement()
         .sessionCreationPolicy( SessionCreationPolicy.STATELESS )

      .and()
         .addFilterBefore( new TokenFilter( tokenService, sessionManager ), CsrfFilter.class );

1 Ответ

0 голосов
/ 30 января 2020

Используйте тот же URL-адрес, но у него есть параметр запроса, например: loginType, который может иметь значение PASSPORT или DEFAULT, и по умолчанию он равен DEFAULT, когда его нет.

Прочитайте этот параметр запроса в вашем Controller и верните другое представление или верните то же представление с состоянием, которое определяет, как страница должна быть настроена для правильного loginType. Подобный подход используется, когда кто-то пытается войти в систему и терпит неудачу, приложение сервлета старой школы добавит error=true и отобразит сообщение об ошибке, что пользователь не смог аутентифицироваться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...