序言

安全性是暴露由许多微服务组成的公共访问API时要考虑的最重要的一个方面。

Spring有一些有趣的功能和框架,使我们的微服务安全配置更容易。

在本文中,我将向您展示如何使用Spring Cloud和Oauth2在API网关后面提供令牌访问安全性。

理论知识

OAuth2标准目前被所有主要网站使用并且允许通过共享API访问其资源。它是一种开放式授权标准,允许用户将存储在一个页面中的私有资源共享到另一个页面,而无需进入其凭据服务。这些是与oauth2相关的基本术语。

Resource Owner – 处理对资源的访问

Resource Server – 存储可以使用特殊令牌共享的所有者资源的服务器

Authorization Server – 管理密钥,令牌和其他临时资源访问代码的分配。它还必须确保授予相关人员访问权限

Access Token – 允许访问资源的密钥

Authorization Grant – 授予访问权限。有多种方法可以确认访问权限:授权代码,隐式,资源所有者密码凭据和客户端凭据

您可以在此处以及在digitalocean文章中阅读有关此标准的更多信息。该协议的流程主要有三个步骤。

首先,我们将授权请求发送给资源所有者。在资源所有者响应后,我们向授权服务器发送授权请求并接收访问令牌。

最后,我们将此访问令牌发送到资源服务器,如果它有效,则API将资源提供给应用程序。

方案

下图显示了我们案例的架构。我们用API网关(Zuul)代理我们对授权服务器的请求和两个帐户微服务实例。

授权服务器是某种提供outh2安全机制的基础结构服务。

我们还有发现服务(Eureka),我们所有的微服务都已注册。

方案

springboot 整合例子

以下是一个简单的Java Spring整合OAuth 2.0的入门例子。这个例子使用Spring Boot构建,并使用Spring Security OAuth2来实现OAuth2.0认证。

在这个例子中,我们将使用GitHub作为OAuth2.0的提供者。

首先,确保你有一个Spring Boot项目的基本结构。

然后,按照以下步骤进行:

  1. 添加Spring Security OAuth2依赖:
  [xml]
1
2
3
4
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-oauth2-client</artifactId> </dependency>
  1. 创建一个OAuth2的配置类:
  [java]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import org.springframework.boot.autoconfigure.security.oauth2.client.EnableOAuth2Sso; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; @Configuration @EnableOAuth2Sso public class OAuth2Config extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/", "/login**").permitAll() .anyRequest().authenticated(); } }
  1. 添加application.yml配置:
  [yaml]
1
2
3
4
5
6
7
8
9
10
11
12
spring: security: oauth2: client: registration: github: client-id: YOUR_CLIENT_ID client-secret: YOUR_CLIENT_SECRET scope: read:user provider: github: user-name-attribute: login

YOUR_CLIENT_IDYOUR_CLIENT_SECRET替换为你在GitHub注册应用时获得的客户端ID和客户端密钥。

  1. 创建一个简单的控制器:
  [java]
1
2
3
4
5
6
7
8
9
10
11
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class HelloController { @GetMapping("/") public String hello() { return "Hello, OAuth2!"; } }

现在,当你启动应用程序时,它将自动重定向到GitHub登录页面进行身份验证。

成功登录后,用户将被重定向回你的应用程序,并且可以访问根路径(“/”),返回”Hello, OAuth2!”。

这只是一个简单的入门例子,你可以根据自己的需求扩展和定制它。

参考资料

使用Oauth2实现微服务的安全保护

https://blog.csdn.net/j3T9Z7H/article/details/88016463