gpt4 book ai didi

java - 如何在 Spring Security 中创建自定义身份验证过滤器?

转载 作者:行者123 更新时间:2023-12-05 01:32:11 25 4
gpt4 key购买 nike

我正在尝试创建自定义 Spring Security 身份验证过滤器以实现自定义身份验证方案。我花了几个小时阅读 Spring Security,但我找到的所有指南都解释了如何配置基本设置;我正在尝试编写自定义设置,但找不到有关如何执行此操作的文档。

为了举例,假设我的自定义身份验证方案如下:如果客户端在 http 请求中提供了“foo_username” header 和“foo_password” header (为了示例均未加密),那么我的自定义过滤器需要构造一个 UsernamePasswordAuthenticationToken。当然,如果密码错误,那就是认证错误。如果缺少任何一个 header ,那就是身份验证错误。如果两个 header 都丢失,我想在不更改任何内容的情况下向下委派过滤器链。

这在理论上似乎很简单,但我不知道如何在 Spring 中实现它。我打算自己检查数据库的密码吗?还是 UserDetailsPasswordService 的责任?我打算自己修改 SecurityContextHolder.getContext().authentication 字段吗?我将哪些职责委托(delegate)给 AuthenticationManager?当身份验证以各种方式失败时,我会抛出哪些异常?我是否实现 Filter、OncePerRequestFilter 或 AbstractAuthenticationFilter?是否有关于如何执行所有这些操作的文档???

诚然,这是 How to create your own security filter using Spring security? 的副本,但我不是他,他没有得到答案。

感谢您的帮助!

最佳答案

编辑:这不是最好的做事方式。它不遵循最佳实践。我没有时间用一个确实遵循最佳实践的例子来更新这个答案。

正如其他人所指出的,最好使用 Basic auth 或 OAuth2,它们都内置在 Spring 中。但是如果你真的想实现一个自定义过滤器,你可以这样做。 (如果我做错了,请纠正我。)但是不要完全这样做。这不是一个非常安全的例子;这是一个简单的例子。

class CustomAuthenticationFilter(val authManager: AuthenticationManager) : OncePerRequestFilter() {

override fun doFilterInternal(request: HttpServletRequest,
response: HttpServletResponse,
chain: FilterChain) {

val username = request.getHeader("foo_username")
val password = request.getHeader("foo_password")

if(username==null && password==null){
// not our responsibility. delegate down the chain. maybe a different filter will understand this request.
chain.doFilter(request, response)
return
}else if (username==null || password==null) {
// user is clearly trying to authenticate against the CustomAuthenticationFilter, but has done something wrong.
response.status = 401
return
}

// construct one of Spring's auth tokens
val authentication = UsernamePasswordAuthenticationToken(username, password, ArrayList())
// delegate checking the validity of that token to our authManager
val userPassAuth = this.authManager.authenticate(authRequest)
// store completed authentication in security context
SecurityContextHolder.getContext().authentication = userPassAuth
// continue down the chain.
chain.doFilter(request, response)
}
}

创建身份验证过滤器后,不要忘记将其添加到 HttpSecurity 配置中,如下所示:

override fun configure(http: HttpSecurity?) {
http!!.addFilterBefore(CustomAuthenticationFilter(authenticationManager()), UsernamePasswordAuthenticationFilter::class.java)
}

关于java - 如何在 Spring Security 中创建自定义身份验证过滤器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65708171/

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