弹簧安全 - 检索用户IP,浏览器信息和请求的页面

2022-09-01 22:40:11

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


答案 1

所有信息均可通过 获得。您可以通过以下方式获取它:HttpServletRequest

依赖注入

最简单的方法是将 servlet 请求直接注入到你的类中: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注入了特殊范围的代理实现,因此您可以从单例范围访问请求范围的请求“bean”。在引擎盖下,对 的参数的每次调用都会路由到您也可以直接访问。如您所见,Spring在范围界定规则方面非常灵活。它只是工作。HttpServletRequestMyDetailsServicerequestorg.springframework.web.context.request.RequestContextHolder#requestAttributesHolderThreadLocal

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>

推荐