- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在我的应用程序中,到目前为止,我已经使用 OAuth2 密码授予流程来生成 JWT 访问 token ,以便客户端使用 Spring Security 和 Spring OAuth 提供用户名和密码。然后,他们在对我的 Spring Boot REST API 的所有请求中使用该 token 。
我的一些客户现在希望改用 SAML 身份验证。我的想法是创建一个单独的端点 /saml/accessToken
并使用 Spring SAML 保护它。 SAML 身份验证完成后,用户将被重定向回 /saml/accessToken
,现在已进行有效身份验证,并获得一个 JWT,客户端可以使用该 JWT 进一步与我的 REST API 进行通信。
我需要一个 Controller 方法,该方法接受经过身份验证的 SAMLAuthenticationToken,使用其凭据生成 JWT,并将其返回给客户端:
@RequestMapping(value = "/saml/accessToken")
public String getAccessToken(SAMLAuthenticationToken authentication) {
return accessTokenFactory.create(authentication);
}
这是我需要帮助的上面示例中的accessTokenFactory
。我希望尽可能遵循 Spring 编码生态系统,避免使用“hack”解决方案,这样我就可以利用已经存在的 TokenEnhancer 等。
从 SAMLAuthenticationToken 创建 JWT 访问 token 的最佳方法是什么?
最佳答案
事实证明,Authentication
成功的 SAML 身份验证流程生成的 SAML cookie 对象实际上是 ExpiringUsernameAuthenticationToken
,不是SAMLAuthenticationToken
。 ExpiringUsernameAuthenticationToken#principal
是User
实现(我们称之为 CustomerUser
)我在 SAML 身份验证期间在我的 SAMLUserDetailsService
中设置实现,与 User
类型相同我在 OAuth2 密码授予流程中使用的。
因为我没有找到任何使用默认 Spring OAuth 方式为 ExpiringUsernameAuthenticationToken
创建 JWT 的方法。 ,我最终单独写了一个JwtFactory#create(ExpiringUsernameAuthenticationToken)
使用jjwt
。这导致了一个干净且简单的解决方案。
这样做的主要缺点是 JwtFactory
无法使用我的TokenEnhancer
beans,负责向 JWT 添加附加参数。因此,在 TokenEnhancer
中存在一定程度的代码和逻辑重复,用于添加额外的 JWT 参数。 s(由 Spring OAuth 使用)和 JwtFactory
(SAML 身份验证后手动使用)。这是应该避免的代码异味。但是将 Spring OAuth 特定功能黑客到我的自定义中 JwtFactory
看起来更糟,所以这是我必须忍受的事情。
关于java - 从 SAMLAuthenticationToken 创建 JWT 访问 token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52947116/
在我的应用程序中,到目前为止,我已经使用 OAuth2 密码授予流程来生成 JWT 访问 token ,以便客户端使用 Spring Security 和 Spring OAuth 提供用户名和密
我是一名优秀的程序员,十分优秀!