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