Skip to main content
 首页 » 编程设计

spring-security之集成 Spring Security OAuth2 和 Spring Social

2024年09月07日16kuangbin

我正在使用 Spring Boot + Spring Security OAuth2 应用程序,我相信该应用程序的灵感来自 Dave Syer 的示例。该应用程序配置为 OAuth2 授权服务器,具有使用资源所有者密码凭据流的单个公共(public)客户端。成功的 token 配置为 JWT。

公共(public) Angular 客户端向/oauth/token 发送一个 POST 请求,其中包含一个包含客户端 ID 和 secret 的基本身份验证 header (这是让客户端进行身份验证的最简单方法,即使 secret 不是私有(private)的)。请求的正文包含用户名、密码和“密码”的授权类型。

除了作为身份验证服务器之外,该应用程序还是用户、团队和组织的 RESTful 资源服务器。

我正在尝试使用 Spring Social 添加额外的 SSO 身份验证流程。我已将 Spring Social 配置为通过/auth/[provider] 通过外部提供程序进行身份验证;但是,以下请求不再正确设置 SecurityContext。可能,Spring Security OAuth 服务器或客户端覆盖了 SecurityContext?

如果我可以在 Spring Social 流程之后正确设置 SecurityContext,那么我就有一个新的 TokenGranter,它允许一种新的“社交”授权类型,它将检查 SecurityContextHolder 以获得预认证用户。

我对 SecurityContext 的特定问题的解决方案(我认为这是 Spring OAuth + Social 集成的问题)感兴趣,或者对与外部提供者进行身份验证并从我们自己的身份验证服务器获取有效 JWT 的不同方法感兴趣。

谢谢!

请您参考如下方法:

首先,我强烈建议您放弃此类用例的密码授权。
公共(public)客户端(JavaScript,已安装的应用程序)无法对其客户端 secret 保密,这就是为什么不能为它们分配一个 secret :任何检查您的 JavaScript 代码的访问者都可以发现该 secret ,从而实现与您相同的身份验证页面,将您的用户密码存储在过程。

已为您正在做的事情创建了隐式授权。
使用基于重定向的流程的优势在于将身份验证机制留给授权服务器,而不是让每个应用程序都有一部分:这主要是单点登录 (SSO) 的定义。

话虽如此,您的问题与我刚刚回答的问题密切相关:Own Spring OAuth2 server together with 3rdparty OAuth providers

总结一下答案:

In the end, it's about how your authorization server secures the AuthorizationEndpoint : /oauth/authorize. Since your authorization server works, you already have a configuration class extending WebSecurityConfigurerAdapter that handles the security for /oauth/authorize with formLogin. That's where you need to integrate social stuff.



您根本无法使用密码授权来实现您想要实现的目标,您必须让您的公共(public)客户端重定向到授权服务器。然后,授权服务器将重定向到社交登录作为其安全机制 /oauth/authorize端点。