Spring 启动基于 OAuth2 角色的授权实现
Spring Boot OAuth2 Role based Authorization Implementation
我在最开始的步骤就卡在了实施过程中。我没有在下面分享任何代码,因为我对选择哪种实现方法感到困惑。
我有以下要求:
- 给定一对
client_id
和 client_secret 到我的授权服务器端点(考虑我从 Postman 访问授权端点),它应该 return 一个访问令牌来访问我的 APIs 驻留在资源服务器
- 我还有一个基于 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_id
和 redirect_uri
(通常是对托管 Angular UI 的域的回调)。
- 授权服务器将通过将浏览器重定向到“身份提供者”来验证用户身份,这通常只会向用户显示要求 user/pass 的登录屏幕。您可以使用 Facebook 或 Google 等身份提供者,或者按照 OIDC 或 SAML 等标准编写您自己的身份提供者。请检查您的身份验证服务器如何与各种身份提供者集成。
- 一旦通过身份验证,身份验证服务器将发出一个 time-sensitive,1 次仅使用“代码”,该代码将被发送回在第一步中提交的原始
redirect_uri
。
- 此“代码”然后由您的 Angular 客户端通过使用
client_id
、redirect_uri
、[=19 调用 /token
端点发送到身份验证服务器=] 和 code
.
- auth 服务器将验证请求详细信息并将浏览器重定向回
redirect_uri
以及生成的访问令牌。
一旦您正确配置了身份验证服务器和身份提供者,您就可以通过 spring security 5 通过查看官方 spring-security documentation.
来保护您的资源服务器
我在最开始的步骤就卡在了实施过程中。我没有在下面分享任何代码,因为我对选择哪种实现方法感到困惑。
我有以下要求:
- 给定一对
client_id
和 client_secret 到我的授权服务器端点(考虑我从 Postman 访问授权端点),它应该 return 一个访问令牌来访问我的 APIs 驻留在资源服务器 - 我还有一个基于 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.
对于您的案例 #1,您使用 client_credentials 授权类型是正确的,我认为您完全理解这个流程。
对于您的案例 #2,Angular 应用程序只是 JavaScript 代码,它无法安全地存储客户端机密。所以最好使用 authorization_code
授权类型。此流程在 OAuth 2 spec 中进行了描述,如下所示:
- 您的 Angular 客户端向授权服务器的
/authorize
端点发送请求。此请求包括client_id
和redirect_uri
(通常是对托管 Angular UI 的域的回调)。 - 授权服务器将通过将浏览器重定向到“身份提供者”来验证用户身份,这通常只会向用户显示要求 user/pass 的登录屏幕。您可以使用 Facebook 或 Google 等身份提供者,或者按照 OIDC 或 SAML 等标准编写您自己的身份提供者。请检查您的身份验证服务器如何与各种身份提供者集成。
- 一旦通过身份验证,身份验证服务器将发出一个 time-sensitive,1 次仅使用“代码”,该代码将被发送回在第一步中提交的原始
redirect_uri
。 - 此“代码”然后由您的 Angular 客户端通过使用
client_id
、redirect_uri
、[=19 调用/token
端点发送到身份验证服务器=] 和code
. - auth 服务器将验证请求详细信息并将浏览器重定向回
redirect_uri
以及生成的访问令牌。
一旦您正确配置了身份验证服务器和身份提供者,您就可以通过 spring security 5 通过查看官方 spring-security documentation.
来保护您的资源服务器