SpringCloud 微服务应用安全——Security

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringCloud 微服务应用安全——Security相关的知识,希望对你有一定的参考价值。

参考技术A

当用户访问某一资源时,需对用户身份进行校验,确保用户的可用性;
若用户不可用,则返回错误信息,不允许访问某一资源;
若用户安全可用,则返回访问令牌;
通过返回的令牌来校验该用户是否有权限访问这个资源;
若有授权,则返回相应的资源;
若未授权,则返回错误的信息。

目前,Spring Cloud提供的安全解决方案是通过Spring Cloud Security整合OAuth 2.0及JWT(javascript WebToken)来构建我们的安全体系。

1、Spring Boot的应用安全
2、微服务安全解决方案
3、基于OAuth 2.0的认证
4、基于JWT的认证

每一个 不曾起舞的日子,都是对生命的辜负。一个人知道自己为什么而活,就可以忍受任何一种生活。其实人跟树是一样的,越是向往高处的阳光,它的根就越要伸向黑暗的地底。

SpringCloud微服务安全网关安全 3-2 常见的微服务安全整体架构

1. 整体架构

这个图适用于中小公司的微服务架构

微服务:SpringBoot 写的Rest服务

服务注册与发现:微服务所必备的。每个微服务都会到上边去注册。不管是微服务之间的调用,还是服务网关到微服务的转发,都是通过服务注册和发现拿到服务的信息,来进行服务的调用或转发。

配置中心:统一管理配置的地方。

服务网关:所有外部请求的入口。微服务不会直接向外暴露,都是通过服务网关来进行转发。

安全中心:整个微服务的认证授权。

熔断限流:统一的管理微服务的限流、熔断、降级等。。

数据总线:左边大块里发生的所有事情,都会通过数据总线(消息队列,根据业务场景,可能是多种)

调用链监控 Tracing:一个请求进来经过了哪些微服务,每个微服务上耗了多长时间,服务的性能瓶颈在哪里。

指标监控 metrics:流量、业务指标

日志监控 log:把所有微服务的日志统一采集起来

健康检查和报警:比如某一个服务的响应时间大于多少就报警 ,某一天的流水有异常了就报警,日志出现某些元素就报警。等等

2. 案例演示 -- 订单微服务&价格微服务

微服务之间使用 RestTemplate 进行远程调用。

2.1 订单微服务

(1)pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.3.4.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.imooc.security</groupId>
	<artifactId>this-order-api</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>this-order-api</name>
	<description>Demo project for Spring Boot</description>

	<properties>
		<java.version>11</java.version>
	</properties>

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

		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<scope>runtime</scope>
		</dependency>
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<optional>true</optional>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
			<exclusions>
				<exclusion>
					<groupId>org.junit.vintage</groupId>
					<artifactId>junit-vintage-engine</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
                <dependency>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-web</artifactId>
                </dependency>
		<dependency>
			<groupId>org.junit.platform</groupId>
			<artifactId>junit-platform-commons</artifactId>
			<version>RELEASE</version>
		</dependency>

		<dependency>
			<groupId>org.apache.commons</groupId>
			<artifactId>commons-lang3</artifactId>
			<version>3.10</version>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>

(2)指定端口为: 9090

spring:
  application:
    name: order-api
server:
  port: 9090

(3)订单实体

@Data
public class OrderInfo {
    private Long productId;
}

(4)订单接口

@RestController
@RequestMapping("/orders")
@Slf4j
public class OrderController {

    private RestTemplate restTemplate = new RestTemplate();

    @PostMapping
    public PriceInfo create(@RequestBody OrderInfo info){
        PriceInfo priceInfo = restTemplate.getForObject("http://localhost:9080/prices/" + info.getProductId(),PriceInfo.class);
        log.info("price is:{}",priceInfo.getPrice());
        return priceInfo;
    }
}

2.2 价格微服务

(1)pom.xml

参考订单微服务的 pom.xml

(2)指定端口为 9080

(3)价格实体

@Data
public class PriceInfo {

    private Long id;

    private BigDecimal price;

}

(4)价格微服务接口

@RestController
@RequestMapping("/prices")
@Slf4j
public class PriceController {

    @GetMapping("/{id}")
    public PriceInfo create(@PathVariable Long id){
        log.info("productId is {}" ,id);
        PriceInfo info = new PriceInfo();
        info.setId(id);
        info.setPrice(new BigDecimal(100));
        return info;
    }
}

2.3 启动两个服务,并用 API Tester 请求订单服务间接请求价格微服务获取价格信息

以上是关于SpringCloud 微服务应用安全——Security的主要内容,如果未能解决你的问题,请参考以下文章

SpringCloud微服务安全API安全 2-1 API安全概述

SpringCloud微服务安全网关安全 3-2 常见的微服务安全整体架构

SpringCloud微服务安全导读与开发环境安装

SpringCloud微服务安全网关安全 3-6 Zuul网关安全开发

重学SpringCloud系列八之微服务网关安全认证-JWT篇

SpringCloud微服务安全API安全 2-2 注入攻击防护