如何使用 spring 安全性使用 ping 访问和在 header 中传递的用户名来验证预验证的 LDAP 用户?

How do I authenticate a preauthenticated LDAP user using spring security using ping access and username passed in the header?

我之前使用的是基本身份验证,但我需要使用 Ping 访问切换到联合身份验证。用户已经过身份验证,用户名和令牌已在请求中发送 header。如何使用 spring 安全性 link 将用户名添加到 ldap 用户主体?

因此,在考虑实施时需要考虑许多事项。这是游戏中的棋子的基本概要。

过滤器链

过滤器链通常用于区分 servlet 和应用程序的其余部分。如果您已经扩展 OncePerRequestFilter 那么您可能已经在正确的道路上。

如果您打算遵循典型的 Spring 安全模型,此过滤器将准备一个 Authentication 对象,然后可以在 AuthenticationManager 中对其进行身份验证。您可以尝试使用现有的 Authentication 实现,例如 PreAuthenticatedAuthenticationToken,或者您可以创建自己的实现并将其命名为 JwtAuthenticationToken.

身份验证管理器

AuthenticationManager 本质上是一组可以验证令牌的提供程序,例如您的 Jwt 令牌。他们的契约与 servlet 是分开的,因此更加灵活。

您可能会创建一个 JwtAuthenticationProvider 来验证令牌,然后调用 UserDetailsService 来获取基础用户。

Spring Security 没有对 JWT 的专门支持,但他们确实有一些使用 Nimbus 的库。您可以查看 spring-security-oauth2-resource-server 中的代码,了解他们如何使用 JWK Set Uri 验证 JWT。你不会想依赖那个库,因为它专注于 OAuth,但它可能会给你一些想法。

用户详情服务

UserDetailsService 实现负责查询后端并从中检索用户。例如,您可能会使用 LdapUserDetailsService

总结

综上所述,这里是我可能会做的事情的总结:

  1. 创建一个 JwtAuthenticationToken 对象,该对象可以容纳 jwt 令牌,并可能在 Spring 安全完成验证过程时代表成功的身份验证。

  2. 创建一个 JwtAuthenticationFilter 从请求中读取令牌并填充 JwtAuthenticationToken,将其发送到 AuthenticationManager.

  3. 创建一个 JwtAuthenticationProvider 读取 JwtAuthenticationToken 并将其发送到 Nimbus(或 Auth0 或其他一些 jwt 库)进行验证。您将需要决定如何信任该令牌——Nimbus 能够通过 JWK Set Uri 进行远程检查,或通过一组预配置的 public 或对称密钥在本地进行检查。 (这里也有很多值得思考的地方!)

  4. 使用LdapUserDetailsService,将已解析主题的名称传递给它。返回的 UserDetails 可以作为您的提供者 returns.

  5. Authentication 对象的主体提供

备选方案

那么,假设您不 want/need 遵循 Spring 安全开发模型,只是想尽快让某些东西发挥作用。

你最终需要完成的两件事是

  1. 判断令牌是否有效。 Spring Security 尚无 OAuth2-free 支持,因此您需要使用 Nimbus 或类似工具自行推出。
  2. 配置和调用 LdapUserDetailsService。从 UserDetails 这给你,你可以建立一个 Authentication 对象,你可以在 SecurityContextHolder.
  3. 上设置

随着时间的推移,这将不那么灵活,但它可能会让您更快地开始。

其他需要考虑的事情

你没有问这个,但我想知道如果令牌不知何故无效你打算做什么。对于这些情况,您可能需要查看 AuthenticationEntryPoints 和 AccessDeniedHandlers。