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

Spring Безопасность - получить IP-адрес пользователя, информацию о браузере и запрошенную страницу

Мы используем RequestHeaderAuthenticationFilter для реализации стратегии предварительной аутентификации и PreAuthenticatedAuthenticationProvider в качестве поставщика проверки подлинности. Одним из требований является сохранение всех успешных логинов в базе данных со следующей информацией. Поскольку пользовательский IP-адрес и другая информация, связанная с запросом, недоступны в классе UserDetailsService, какова лучшая стратегия для получения этой информации и сохранения в db?

4b9b3361

Ответ 1

Вся информация доступна через HttpServletRequest. Вы можете получить его:

Включение зависимостей

Самый простой способ - запросить запрос сервлета непосредственно в ваш класс UserDetailsService::

public MyDetailsService implements UserDetailsService {

  @Autowired
  private HttpServletRequest request;

  //...

}

(как было предложено OP) Не забудьте добавить следующего прослушивателя в свой web.xml:

<listener>
    <listener-class>
        org.springframework.web.context.request.RequestContextListener
    </listener-class>
</listener>

UPDATE: Это работает, потому что Spring внедряет специальный расширенный прокси-сервер, реализующий HttpServletRequest, поэтому вы можете получить запрос с запросом на запрос "bean" из singleton-scoped MyDetailsService. Под капотом каждый вызов параметров request направляется на org.springframework.web.context.request.RequestContextHolder#requestAttributesHolder ThreadLocal, к которому вы также можете получить доступ напрямую. Как вы можете видеть, Spring очень гибкий, когда дело доходит до правил определения области. Он просто работает.

RequestContextHolder

Другой подход заключается в использовании RequestContextHolder:

HttpServletRequest request = 
  ((ServletRequestAttributes) RequestContextHolder.
    currentRequestAttributes()).
    getRequest();

Дальнейшее чтение:

Ответ 2

Это может быть хороший подход:

1) Создайте класс, который расширяет SavedRequestAwareAuthenticationSuccessHandler

public class MyCustomSuccessHandler extends SimpleUrlAuthenticationSuccessHandler {

    @Override
    public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,
            Authentication authentication) throws ServletException, IOException {

2) Назначьте "обработчик успеха" вашему фильтру безопасности:

<beans:bean id="myFilter" class="org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter">
        <beans:property name="authenticationManager" ref="authenticationManager"/>
        <beans:property name="authenticationFailureHandler" ref="failureHandler" />
               <beans:property name="authenticationSuccessHandler" ref="successHandler" />
    </beans:bean>

<beans:bean id="successHandler" class="yourPackage.MyCustomSuccessHandler" >
        <beans:property name="defaultTargetUrl" value="/index.html" /> 
        <beans:property name="alwaysUseDefaultTargetUrl" value="true"/> 
    </beans:bean>