Подтвердить что ты не робот

Как определить настраиваемый AuthenticationEntryPoint без конфигурации XML

Я боролся уже несколько дней. Я вроде как новичок в Spring Boot, и, как идея не использовать конфигурацию XML.

Я создал приложение RESTfull (с JSON). Я следую этот учебник для правильной настройки подлинности.

Мне кажется, мне удалось воспроизвести почти все его конфигурации с использованием конфигурации Java, за исключением одной вещи - AuthenticationEntryPoint

Учебник использует свойство в теге http, подобное этому, и определяет formLogin следующим образом:

<http entry-point-ref="restAuthenticationEntryPoint">

  <intercept-url pattern="/api/admin/**" access="ROLE_ADMIN"/>

  <form-login
     authentication-success-handler-ref="mySuccessHandler"
     authentication-failure-handler-ref="myFailureHandler"
  />

  <logout />

</http>

Объяснение AuthenticationEntryPoint в Spring Руководство по безопасности говорит:

AuthenticationEntryPoint может быть задан с использованием атрибута entry-ref-ref на <http> .

Не упоминает ничего о том, как это сделать, используя конфигурацию Java.

Итак, как я могу "зарегистрировать" свой собственный restAuthenticationEntryPoint без XML, чтобы предотвратить перенаправление к форме входа при использовании formLogin?

Ниже я расскажу о том, что я пробовал.

Спасибо всем.


В моих попытках найдено, что вы можете определить его с помощью basicAuth следующим образом:

@Configuration
@Order(1)                                                        
public static class RestWebSecurityConfigurationAdapter extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {


        if (restAuthenticationEntryPoint == null) {
            restAuthenticationEntryPoint = new RestAuthenticationEntryPoint();
        }

        http
            .authorizeRequests()
                .antMatchers("/**").hasAnyRole(Sec.ADMIN,Sec.SUPER_USER)
...
        .and()
            .httpBasic()
                .authenticationEntryPoint(restAuthenticationEntryPoint)

Но я использую логин формы вроде этого (без части httpBasic):

        .and()
            .formLogin()
                .successHandler(mySavedRequestAwareAuthenticationSuccessHandler)
                .failureHandler(simpleUrlAuthenticationFailureHandler)

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

документация для FormLoginConfigurer (используется класс .formLogin()):

Созданные общие объекты

Заселяются следующие общие объекты

AuthenticationEntryPoint

Но не удалось найти способ переопределить его.
Любые идеи?

P.S.
Не думайте, что было бы неплохо переопределить форму входа в пользовательскую, которая возвращает ошибку.

4b9b3361

Ответ 1

Цитата из представленных вами документов ref указывает на http.exceptionHandling(). Вы можете настроить там общую точку доступа.

http.exceptionHandling().authenticationEntryPoint(myEntryPoint);