我之前使用的是基本身份验证,但我需要使用 Ping Access 切换到联合身份验证。用户已通过身份验证,用户名和令牌一起在请求标头中发送。如何使用 Spring Security 将用户名链接到 ldap 用户主体?
1 回答
因此,在您考虑实施时,需要考虑许多事项。这是一个非常基本的游戏片段。
过滤链
过滤器链通常用于区分 servlet 和应用程序的其余部分。如果您已扩展OncePerRequestFilter
,那么您可能已经走上了正确的道路。
如果您打算遵循典型的 Spring Security 模型,则此过滤器将准备一个Authentication
对象,然后可以在AuthenticationManager
. 您可以尝试使用现有的Authentication
实现,例如PreAuthenticatedAuthenticationToken
,或者您可以创建自己的并调用它JwtAuthenticationToken
。
身份验证管理器
AuthenticationManager
本质上是可以对令牌进行身份验证的提供者的集合,例如您的 Jwt 令牌。它们的契约与 servlet 是分开的,因此更加灵活。
您可能会创建一个JwtAuthenticationProvider
来验证令牌,然后调用 aUserDetailsService
来获取底层用户。
Spring Security 没有对 JWT 的专门支持,但他们确实有一些使用 Nimbus 的库。您可以查看 spring-security-oauth2-resource-server 中的代码,了解他们如何使用 JWK Set Uri 验证 JWT。您不想依赖该库,因为它专注于 OAuth,但它可能会给您一些想法。
用户详情服务
UserDetailsService
实现负责查询后端并从中检索用户。例如,LdapUserDetailsService
您可能会使用。
概括
所以,说了这么多,这里是我可能会做的总结:
创建一个
JwtAuthenticationToken
可以容纳 jwt 令牌的对象,并在 Spring Security 完成验证过程时可能表示成功的身份验证。创建一个
JwtAuthenticationFilter
从请求中读取令牌并填充 的JwtAuthenticationToken
,将其发送到AuthenticationManager
。创建一个
JwtAuthenticationProvider
读取 aJwtAuthenticationToken
并将其发送到 Nimbus(或 Auth0 或其他一些 jwt 库)进行验证的 a。您需要决定如何信任该令牌——Nimbus 能够通过 JWK Set Uri 远程检查或通过预配置的一组公钥或对称密钥在本地进行检查。(这里也有很多值得思考的地方!)使用
LdapUserDetailsService
,将已解析主题的名称传递给它。返回的UserDetails
可以作为提供Authentication
者返回的对象的主体提供。
备择方案
因此,假设您不想/不需要遵循 Spring Security 开发模型,而只想让某些东西尽快工作。
您最终需要完成的两件事是
- 确定令牌是否有效。Spring Security 对此还没有 OAuth2-free 支持,因此您需要使用 Nimbus 或类似工具自行开发。
- 配置和调用
LdapUserDetailsService
. 从这UserDetails
给您,您可以构建一个Authentication
可以在SecurityContextHolder
.
随着时间的推移,这样的灵活性将不那么灵活,但它可能会让你更快地开始。
其他需要考虑的事情
您没有问过这个问题,但我想知道如果令牌因某种原因无效,您打算做什么。对于这些情况,您可能需要查看AuthenticationEntryPoint
s 和AccessDeniedHandler
s。