Spring security 3 http-базовая аутентификация-обработчик успеха

H я использую весеннюю безопасность

для входа в форму у меня есть

<http auto-config="true">
        <intercept-url pattern="/pages/**" access="ROLE_USER" />
        <form-login authentication-success-handler-ref="authenticationSuccessHandler" login-page="/login.html" default-target-url="/pages/index.html"
            always-use-default-target="true" authentication-failure-url="/login.html" />
        <logout logout-success-url="/login.html" invalidate-session="true" />
        <anonymous enabled='false'/>
</http>

здесь я могу установить authentication-success-handler-refКак я могу добавить один к моей основной аутентификации:

<http pattern="/REST/**" realm="REALM" entry-point-ref="authenticationEntryPoint">
    <intercept-url pattern="/**" access="ROLE_USER" />
    <http-basic  />
    <logout logout-url="/REST/logout" success-handler-ref="restLogoutSuccessHandler" />
</http>

я подумал о переопределении BasicAuthenticationFilter, но как я могу ввести свой класс cutom для <http-basic />

2 ответа

Решение

Вы не можете установить обработчик успеха аутентификации для BASIC-аутентификации. Однако вы можете расширить BasicAuthenticationFilter и переопределить метод onSuccessfulAuthentication:

@Component("customBasicAuthFilter")
public class CustomBasicAuthFilter extends BasicAuthenticationFilter {

    @Autowired
    public CustomBasicAuthFilter(AuthenticationManager authenticationManager) {
        super(authenticationManager);
    }

    protected void onSuccessfulAuthentication(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Authentication authResult) {
        // Do what you want here
    }
}

Добавьте его в конфигурацию безопасности с помощью чего-то вроде:

<http entry-point-ref="basicEntryPoint">
  <custom-filter ref="customBasicAuthFilter" position="BASIC_AUTH_FILTER"/>
</http>
<authentication-manager alias="authenticationManager">
  ...
</authentication-manager>

Обновление: или с конфигурацией Java вместо XML:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
      .addFilterAt(customBasicAuthFilter, BasicAuthenticationFilter.class)
      .exceptionHandling().authenticationEntryPoint(basicEntryPoint);
}

В качестве обходного пути вы можете использовать http-basic в сочетании с form-login:

<http auto-config="true">
    ...
    <http-basic  />
    <form-login authentication-success-handler-ref="authenticationSuccessHandler" ... />
    ...
</http>

BasicAuthenticationFilter будет работать.

РЕДАКТИРОВАТЬ. Если вы хотите настроить переопределенную версию BasicAuthenticationFilter, я думаю, что вам необходимо:

  1. Добавьте его в цепочку фильтров в позиции BASIC_AUTH_FILTER, как описано здесь
  2. Установите соответствующую точку входа BasicAuthenticationEntryPoint через атрибут entry-point-ref тега http.

Вместо использования AuthenticationSuccessHandler вы можете положиться на механизм событий Spring Security и слушать AuthenticationSuccessEvent с помощью интерфейса ApplicationListener:

@Component
public class AuthenticationEventListener implements
    ApplicationListener<AuthenticationSuccessEvent>
{

    @Override
    public void onApplicationEvent (AuthenticationSuccessEvent event) {
       // do what you want here
       // example: persist event to the database
    }
}

Смотрите также этот ответ здесь: /questions/13208384/zapis-loginov-s-pomoschyu-spring-security/13208387#13208387

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