Spring 启动基于 OAuth2 角色的授权实现

Spring Boot OAuth2 Role based Authorization Implementation

我在最开始的步骤就卡在了实施过程中。我没有在下面分享任何代码,因为我对选择哪种实现方法感到困惑。

我有以下要求:

  1. 给定一对 client_id 和 client_secret 到我的授权服务器端点(考虑我从 Postman 访问授权端点),它应该 return 一个访问令牌来访问我的 APIs 驻留在资源服务器
  2. 我还有一个基于 Angular 的 Web 应用程序,它将使用具有某些角色的组织凭据登录,例如 'ADMIN'、'USER',我需要根据这些角色限制 API 从 Web 应用程序访问

在阅读了许多关于不同 oauth 授权类型的文章后,我开始明白对于第一个要求,最好使用 clinet_credentials 授权类型,因为它不需要用户身份验证。 但是我有 Spring 安全依赖项,默认情况下它会检查和验证用户。如何在没有用户身份验证的情况下实现我的第一个要求?

但是在我的第二个要求中,员工数据库由组织管理。使用组织凭据,我需要根据登录用户的角色进行身份验证,我必须执行角色管理,其中 Web 用户界面我想隐藏几个 UI 组件并限制几个 API 访问在服务器中

我应该采用什么实现方法,在这种情况下必须使用什么 grant_type?

是否必须使用以下两个依赖项?他们是否以任何方式相互独立/依赖?

<dependency>
            <groupId>org.springframework.security.oauth.boot</groupId>
            <artifactId>spring-security-oauth2-autoconfigure</artifactId>
            <version>2.1.0.RELEASE</version>
</dependency>

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
</dependency>

我问的原因是因为 Spring 仅安全性,我被迫使用用户和密码进行身份验证,而在我的第一个要求中,我只想提供客户端 ID 和客户端密码客户端凭据授予类型。

请分享任何与我的设计或任何示例代码相关的有用链接。

提前致谢!

这个问题有很多东西要解开。首先,spring-security-oauth2 模块已被弃用,spring-security 5.

中支持通过 OAuth2 令牌保护 spring-boot 应用程序

对于您的案例 #1,您使用 client_credentials 授权类型是正确的,我认为您完全理解这个流程。

对于您的案例 #2,Angular 应用程序只是 JavaScript 代码,它无法安全地存储客户端机密。所以最好使用 authorization_code 授权类型。此流程在 OAuth 2 spec 中进行了描述,如下所示:

  • 您的 Angular 客户端向授权服务器的 /authorize 端点发送请求。此请求包括 client_idredirect_uri(通常是对托管 Angular UI 的域的回调)。
  • 授权服务器将通过将浏览器重定向到“身份提供者”来验证用户身份,这通常只会向用户显示要求 user/pass 的登录屏幕。您可以使用 Facebook 或 Google 等身份提供者,或者按照 OIDC 或 SAML 等标准编写您自己的身份提供者。请检查您的身份验证服务器如何与各种身份提供者集成。
  • 一旦通过身份验证,身份验证服务器将发出一个 time-sensitive,1 次仅使用“代码”,该代码将被发送回在第一步中提交的原始 redirect_uri
  • 此“代码”然后由您的 Angular 客户端通过使用 client_idredirect_uri、[=19 调用 /token 端点发送到身份验证服务器=] 和 code.
  • auth 服务器将验证请求详细信息并将浏览器重定向回 redirect_uri 以及生成的访问令牌。

一旦您正确配置了身份验证服务器和身份提供者,您就可以通过 spring security 5 通过查看官方 spring-security documentation.

来保护您的资源服务器