一、Spring Cloud Config注册至Eureka
在真实的项目环境中,Spring Cloud Config配置中心难免会出现各种问题,我们需要将 Spring Cloud Config 设置为高可用,Spring Cloud Config的高可用机制解决方式非常简单,把Spring Cloud Config注册到 Eureka 即可,此时用户访问的时候不是直接从配置中心获取配置信息,而是先通过eureka中获取配置中心的地址,然后再从配置中心获取具体服务的配置信息
1、Spring Cloud Config Server多配置中心
1、将 springcloud-8-service-config 下的 application.properties 复制3份
application-config8887.properties
application-config8888.properties
application-config8889.properties
2、向 Eureka 注册中心注册服务
server.port=8888
spring.application.name=springcloud-8-service-config
#uri 表示配置中心所在仓库的位置(GitHub站点访问较慢由于网络比较慢,可能连接失败;此处我们使用国内码云gitee()
spring.cloud.config.server.git.uri=https://gitee.com/xx/springcloud-config.git
#search-paths 表示仓库下的子目录
spring.cloud.config.server.git.search-paths=config-center/provider,config-center/consumer
#GitHub 用户名,密码(如果Git仓库为公开仓库,可以不填写用户名和密码)
spring.cloud.config.server.git.username=xx
spring.cloud.config.server.git.password=xx
# 忽略ssl或者自动填充公钥
spring.cloud.config.server.git.skip-ssl-validation=true
#配置rabbitmq
spring.rabbitmq.host=192.168.133.128
spring.rabbitmq.port=5672
spring.rabbitmq.username=root
spring.rabbitmq.password=root
#开启spring cloud bus,默认是开启的,也可以省略该配置
spring.cloud.bus.enabled=true
#打开所有的web访问端点
management.endpoints.web.exposure.include=*
#每间隔10s,向服务端发送一次心跳,证明自己依然"存活"
eureka.instance.lease-renewal-interval-in-seconds=10
#告诉服务端,如果我60s之内没有给你发心跳,就代表我故障了,将我踢出掉
eureka.instance.lease-expiration-duration-in-seconds=60
#告诉服务端,服务实例以IP作为链接,而不是取机器名
eureka.instance.prefer-ip-address=true
eureka.client.eureka-server-connect-timeout-seconds=30
eureka.client.eureka-server-read-timeout-seconds=60
#告诉服务端,服务实例的id,id要是唯一的(分别 springcloud-8-service-config-8887,springcloud-8-service-config-8888,springcloud-8-service-config-8889)
eureka.instance.instance-id=springcloud-8-service-config
#eureka注册中心的连接地址
eureka.client.service-url.defaultZone=http://eureka8761:8761/eureka,http://eureka8762:8762/eureka,http://eureka8763:8763/eureka
3、添加eureka-client依赖
<!--spring-cloud-starter-netflix-eureka-client-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
4、在客户端 springcloud-8-service-config-consumer 增加对eureka注册中心的配置 ,bootstrap.properties文件:
#使用spring-cloud-config配置中心
#name 对应配置文件中的 application
#profile 对应 profile
#label 对应 label
#uri 表示配置中心的地址
spring.application.name=application
spring.cloud.config.profile=dev8081
spring.cloud.config.label=master
#http://localhost:8888/
spring.cloud.config.uri=http://192.168.133.128:8888/
#配置中心的url可以通过注册中心发现
spring.cloud.config.discovery.enabled=true
# 在eureka中注册的服务名
spring.cloud.config.discovery.service-id=springcloud-8-service-config
当某些配置中心宕机后,客户端的微服务会基于注册中心去尝试下一个配置中心的url
2、Nginx
spring.cloud.config.uri=http://nginx的ip:nginx端口/
这个url写成访问nginx,然后通过nginx负载均衡转发到3个config服务
二、Spring Cloud Config 集成 Security 安全认证
为了保护配置中心的敏感数据,需要对Config Server进行安全保护,当前基于Spring Security方案,为Config Server增加最简单的Basic安全认证
1、Config Server 服务端 springcloud-8-service-config 添加依赖
<!-- spring-boot-starter-security
config 配置中心安全认证
-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
2、在application.properties文件中配置账号和密码:
#安全认证;配置访问config配置中心的访问账号和密码
spring.security.user.name=admin
spring.security.user.password=123456
3、启动Config Server,测试验证,先只启动Config Server,通过浏览器的URL访问配置中心
http://localhost:8888/master/application-dev.properties
首先会跳到登录界面,要求输入用户名密码:
4、如果认证成功后,访问到对应的配置
5、 Config Client配置用户名密码,客户端要访问配置中心;修改bootstrap.yml,配置上面的用户名密码
#安全认证;配置访问config配置中心的访问账号和密码
spring.cloud.config.username=admin
spring.cloud.config.password=123456
注:
config server 中和 config client 配置不同,服务端是 spring.security. 配置;客户端 是spring.cloud.config. 配置
三、Spring Cloud Eureka 集成 Security 安全认证
一般情况下Eureka 都会在一个内网环境中,但某些项目中需要让其他外网的服务注册到Eureka,这个时候就有必要让Eureka增加一套安全认证机制了,让所有服务提供者通过安全认证后才能注册进来
1、在 eureka server 端 springcloud-3-service-eureka 添加 spring-boot-starter-security 依赖
<!-- spring-boot-starter-security
config 配置中心安全认证
-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
2、eureka server 端 配置文件 application.properties 设置访问账户,密码
#安全认证;配置访问config配置中心的访问账号和密码
spring.security.user.name=admin
spring.security.user.password=123456
3、eureka server 端 编写配置类EurekaSecurityConfig,重写configure方法,把 csrf 劫持置为不可用,让服务能被接收和注册
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
/**
* csrf置为不可用
*/
@Configuration
@EnableWebSecurity
public class EurekaSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
//csrf置为不可用
http.csrf().disable();
super.configure(http);
}
}
4、客户端访问的时候注册中心url中添加用户名和密码
#指定服务注册中心的位置
eureka.client.service-url.defaultZone=http://admin:123456@localhost:8761/eureka
5、启动 eureka server 服务,浏览器输入 http://eureka8761:8761/
会先跳转到 登录页,输入账户密码即可访问
输入账户,密码后就能访问eureka 控制台
四、CSRF
CSRF(Cross-site request forgery),也被称为:one click attack/session riding,中文名称:跨站请求伪造,缩写为:CSRF/XSRF。
CSRF(Cross-site request forgery)简称:跨站请求伪造,攻击者通过伪造用户的浏览器的请求,向访问一个用户自己曾经认证访问过的网站发送出去,使目标网站接收并误以为是用户的真实操作而去执行命令。常用于盗取账号、转账、发送虚假消息等。攻击者利用网站对请求的验证漏洞而实现这样的攻击行为,网站能够确认请求来源于用户的浏览器,却不能验证请求是否源于用户的真实意愿下的操作行为。
CSRF攻击原理:
网站是通过cookie
来实现登录功能的。而cookie
只要存在浏览器中,那么浏览器在访问这个cookie
的服务器的时候,就会自动的携带cookie
信息到服务器上去。那么这时候就存在一个漏洞了,如果你访问了一个别有用心或病毒网站,这个网站可以在网页源代码中插入js代码,使用js代码给其他服务器发送请求(比如ICBC的转账请求)。那么因为在发送请求的时候,浏览器会自动的把cookie
发送给对应的服务器,这时候相应的服务器(比如ICBC网站),就不知道这个请求是伪造的,就被欺骗过去了。从而达到在用户不知情的情况下,给某个服务器发送了一个请求(比如转账)。