Spring Security - 检索用户IP,浏览器信息和请求的页面

RKo*_*dla 22 java spring spring-mvc spring-security

我们使用RequestHeaderAuthenticationFilteras实现预身份验证策略和PreAuthenticatedAuthenticationProvider身份验证提供程序.其中一个要求是使用以下信息将所有成功登录存储到数据库.由于用户IP地址和其他请求相关信息在UserDetailsService课堂上不可用,检索此信息并在db中存储的最佳策略是什么?

Tom*_*icz 36

所有信息都可以通过HttpServletRequest.您可以通过以下方式获取:

依赖注入

最简单的方法是将servlet请求直接注入到您的UserDetailsService:类中:

public MyDetailsService implements UserDetailsService {

  @Autowired
  private HttpServletRequest request;

  //...

}
Run Code Online (Sandbox Code Playgroud)

(根据OP的建议)请记住将以下监听器添加到您的web.xml:

<listener>
    <listener-class>
        org.springframework.web.context.request.RequestContextListener
    </listener-class>
</listener>
Run Code Online (Sandbox Code Playgroud)

更新:这是有效的,因为Spring注入了特殊的作用域代理实现HttpServletRequest,因此您可以从singleton-scoped访问请求范围的请求"bean" MyDetailsService.在引擎盖下,每次调用request的参数都会被路由到org.springframework.web.context.request.RequestContextHolder#requestAttributesHolder ThreadLocal您也可以直接访问.正如您所看到的,Spring在确定范围规则时非常灵活.它只是有效.

RequestContextHolder

另一种方法是使用RequestContextHolder:

HttpServletRequest request = 
  ((ServletRequestAttributes) RequestContextHolder.
    currentRequestAttributes()).
    getRequest();
Run Code Online (Sandbox Code Playgroud)

进一步阅读:


Dan*_*cco 5

这可能是一个很好的方法:

1)创建一个扩展SavedRequestAwareAuthenticationSuccessHandler的类

public class MyCustomSuccessHandler extends SimpleUrlAuthenticationSuccessHandler {

    @Override
    public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,
            Authentication authentication) throws ServletException, IOException {
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)