2

我之前使用的是基本身份验证,但我需要使用 Ping Access 切换到联合身份验证。用户已通过身份验证,用户名和令牌一起在请求标头中发送。如何使用 Spring Security 将用户名链接到 ldap 用户主体?

4

1 回答 1

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您可能会使用。

概括

所以,说了这么多,这里是我可能会做的总结:

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

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

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

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

备择方案

因此,假设您不想/不需要遵循 Spring Security 开发模型,而只想让某些东西尽快工作。

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

  1. 确定令牌是否有效。Spring Security 对此还没有 OAuth2-free 支持,因此您需要使用 Nimbus 或类似工具自行开发。
  2. 配置和调用LdapUserDetailsService. 从这UserDetails给您,您可以构建一个Authentication可以在SecurityContextHolder.

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

其他需要考虑的事情

您没有问过这个问题,但我想知道如果令牌因某种原因无效,您打算做什么。对于这些情况,您可能需要查看AuthenticationEntryPoints 和AccessDeniedHandlers。

于 2018-08-14T16:47:45.263 回答