Я боролся уже несколько дней. Я вроде как новичок в 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.
Не думайте, что было бы неплохо переопределить форму входа в пользовательскую, которая возвращает ошибку.