gpt4 book ai didi

spring - 在 Spring Security 中的 DaoAuthenticationProvider 身份验证期间访问 HttpServletRequest

转载 作者:行者123 更新时间:2023-12-02 09:41:39 25 4
gpt4 key购买 nike

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

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

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

我在这里和 Spring 论坛上读到的一些其他解决方案似乎建议注入(inject) AuthenticationDetailsS​​ource、使用 custom-filter 以及我不理解的其他步骤刚接触 Spring Security。

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

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

最佳答案

您可以使用RequestContextHolder,它实际上包含相同的请求,尽管Spring Security通常会包装传入的请求,因此您可能会获得不同的引用,具体取决于您是否放置RequestContextFilter 在 Spring Security 链之前或之后(请注意,您可以通过将从 RequestContextHolder 返回的值与应用程序 Controller 中的请求进行比较来轻松检查这一点)。

正如您提到的,注入(inject)自定义 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”参数是如何设置的吗?

关于spring - 在 Spring Security 中的 DaoAuthenticationProvider 身份验证期间访问 HttpServletRequest,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9854592/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com