在DaoAuthenticationProvider期间在Spring Security中进行身份验证时访问HttpServletRequest

时间:2012-03-24 19:00:23

标签: spring authentication servlets spring-security

我需要在Spring安全性HttpServletRequest中访问DaoAuthenticationProvider对象。

安全组件扩展了DaoAuthenticationProvider,我们覆盖authenticate方法来执行一些自定义身份验证/验证。需要进行额外检查以验证请求URL中的用户ip地址作为查询字符串参数(例如:http://domain.com/context?ip=192.168.0.1)。

我正在尝试的当前方法是使用RequestContextHolder线程本地并在我的自定义DAOAuthenticationProvider中获取http请求。

我在这里和春季论坛上阅读的其他一些解决方案似乎建议注入AuthenticationDetailsSource,使用custom-filter以及由于不熟悉弹簧安全而我不理解的其他步骤。 / p>

我们会有不同的Web应用程序使用相同的安全组件来执行身份验证。

有人可以指出我正确的方向或帮助我以前实施的任何方法吗?

2 个答案:

答案 0 :(得分:3)

您可以使用RequestContextHolder并且它有效地包含相同的请求,尽管Spring Security通常会包含传入的请求,因此您可能会获得不同的引用,具体取决于您是在之前还是之后放置RequestContextFilter Spring Security链(请注意,您可以通过将RequestContextHolder返回的值与应用程序控制器中的请求进行比较来轻松地自行检查)。

如您所述,注入自定义AuthenticationDetails也相对容易:

package com.mycompany;

public class MyWebAuthenticationDetailsSource implements AuthenticationDetailsSource {
    public Object buildDetails(Object context) {
        return ((HttpServletRequest)context).getParameter("ip");
    }
}

然后使用

<bean id="ads" class="com.mycompany.MyWebAuthenticationDetailsSource />

<bean id="formLoginFilter" class="org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter">
    <property name="authenticationDetailsSource" ref="ads" />
    <property name="authenticationManager" ref="authenticationmanager" />
</bean> 

并将其添加为参考手册中所述的自定义过滤器。 3.1在命名空间supports this directly in the form-login element中。然后Authentication.getDetails()将返回“ip”参数的值。

请注意,您可能不应该使用3.0.4,因为它已知安全漏洞。

另外,你能解释一下如何设置“ip”参数吗?

答案 1 :(得分:1)

您可以在web.xml中添加Spring的RequestContextFilter。这样,属性将在每个请求中保存在当前线程上。然后,您可以获得原始的HtttpServletRequest:

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