Spring Security - получить IP-адрес пользователя, информацию о браузере и запрашиваемую страницу - PullRequest
22 голосов
/ 20 октября 2011

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

Ответы [ 2 ]

34 голосов
/ 20 октября 2011

Вся информация доступна через 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>

ОБНОВЛЕНИЕ: Это работает, потому что Spring внедряет специальный прокси с областью действия, реализующий HttpServletRequest, так что вы можете получить доступСфера действия запроса "bean" от синглтона MyDetailsService.Под капотом каждый вызов параметров request направляется на org.springframework.web.context.request.RequestContextHolder#requestAttributesHolder ThreadLocal, к которому вы также можете получить прямой доступ.Как вы можете видеть, Spring очень гибок, когда дело доходит до определения правил.Это просто работает.

RequestContextHolder

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

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

Далее:

5 голосов
/ 21 октября 2011

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

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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...