我需要在Spring安全性HttpServletRequest
中访问DaoAuthenticationProvider
对象。
安全组件扩展了DaoAuthenticationProvider
,我们覆盖authenticate
方法来执行一些自定义身份验证/验证。需要进行额外检查以验证请求URL中的用户ip地址作为查询字符串参数(例如:http://domain.com/context?ip=192.168.0.1
)。
我正在尝试的当前方法是使用RequestContextHolder
线程本地并在我的自定义DAOAuthenticationProvider
中获取http请求。
我在这里和春季论坛上阅读的其他一些解决方案似乎建议注入AuthenticationDetailsSource
,使用custom-filter
以及由于不熟悉弹簧安全而我不理解的其他步骤。 / p>
我们会有不同的Web应用程序使用相同的安全组件来执行身份验证。
有人可以指出我正确的方向或帮助我以前实施的任何方法吗?
答案 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();