Spring Boot OAuth2基于角色的授权实现

时间:2020-09-30 16:40:19

标签: spring-boot spring-security oauth-2.0 spring-security-oauth2

在开始的最初阶段,我就停留在实现上。我下面没有分享任何代码,因为我对选择哪种实现方法感到困惑。

我有以下要求:

  1. client_id和client_secret对授予我的Authorization Server端点(考虑到我从Postman击中Authorization端点),它应该返回访问令牌以访问我驻留在Resource Server中的API
  2. 我还有一个基于Angular的Web应用程序,该应用程序将使用具有某些角色(例如“ ADMIN”,“ USER”)的组织凭据登录,基于该凭据,我需要限制来自Web应用程序的API访问权限

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

但是,在我的第二个要求中,雇员数据库由组织管理。使用组织凭据,我需要进行身份验证,并基于登录用户的角色,我必须执行角色管理,其中,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 Security,我被迫使用用户名和密码进行身份验证,而在我的第一个要求中,我只想提供具有客户机凭证授予类型的客户机ID和客户机机密。 / p>

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

谢谢!

1 个答案:

答案 0 :(得分:1)

这个问题有很多要解说的地方。首先,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所在域的回调)。
  • 授权服务器将通过将浏览器重定向到“身份提供商”来对用户进行身份验证,该身份提供商通常只会向用户显示一个询问用户/密码的登录屏幕。您可以使用诸如Facebook或Google之类的身份提供者,也可以遵循OIDC或SAML之类的标准编写自己的身份提供者。请与您的身份验证服务器联系,以了解如何与各种身份提供商集成。
  • 通过身份验证后,身份验证服务器将发布时间敏感的1次仅使用“代码”的代码,该代码将发送回第一步中提交的原始redirect_uri
  • 然后,您的Angular客户端通过使用/tokenclient_idredirect_uri和{{1 }}。
  • 身份验证服务器将验证请求详细信息,并将浏览器连同生成的访问令牌重定向到grant_type=authorization_code

在正确配置了身份验证服务器和身份提供程序之后,您可以通过查看官方spring-security documentation来通过Spring Security 5保护资源服务器。