说明:SpringCloud系列笔者自学系列,学习来源是周立的博客 http://www.itmuch.com/ 。而此处转载其博客只是为了方便自己以后的学习。
本篇来源 http://www.itmuch.com/spring-cloud/finchley-out-1-eureka-security/
前文的示例中,Eureka Server都是允许匿名访问的,该方式一般无法满足公司在安全性上的诉求。
本节来构建一个需要登录才能访问的Eureka Server。Eureka本身不具备安全认证的能力,Spring Cloud使用Spring Security为Eureka Server进行了增强。
Eureka Server端
改造
-
加依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency>
-
加配置
spring: security: user: name: user # 配置登录的账号是user password: password123 # 配置登录的密码是password123
如不设置这段内容,账号默认是user,密码是一个随机值,该值会在启动时打印出来。
-
改配置
将Eureka Server中的
eureka.client.service-url.defaultZone
修改为为http://{user}:{password}@EUREKA_HOST:EUREKA_PORT/eureka/
的形式:eureka: client: service-url: defaultZone: http://user:password123@localhost:8761/eureka/
-
写代码
/** * Spring Cloud Finchley及更高版本,必须添加如下代码,部分关闭掉Spring Security * 的CSRF保护功能,否则应用无法正常注册! * ref: http://cloud.spring.io/spring-cloud-netflix/single/spring-cloud-netflix.html#_securing_the_eureka_server * @author zhouli */ public class WebSecurityConfig extends WebSecurityConfigurerAdapter { protected void configure(HttpSecurity http) throws Exception { http.csrf().ignoringAntMatchers("/eureka/**"); super.configure(http); } }
Spring Cloud Finchley及更高版本必须添加这一段,在Edgware以及更早的版本中无需这一步骤。
测试
-
启动Eureka Server并访问
http://localhost:8761
,可跳转至类似如下的登录页面: -
输入账号
user
,密码password123
后,即可正常访问Eureka Server首页。
Eureka Client端
如何将微服务注册到需认证的Eureka Server上呢——和Eureka Server端一样,只须将eureka.client.service-url.defaultZone
配置为http://{user}:{password}@EUREKA_HOST:EUREKA_PORT/eureka/
的形式即可:
eureka: client: serviceUrl: defaultZone: http://user:password123@localhost:8761/eureka/ |
数据权限·吐槽·拓展
实际项目中,出于安全考虑,往往还需实现数据权限。
举个例子:
- 团队1维护微服务A、B、C
- 团队2维护微服务D、E、F
从安全的角度,我们希望:
- 团队1中的开发人员只能操作微服务A、B、C在Eureka Server上的信息;
- 团队1中的开发人员只能访问其他团队授权给该团队的微服务的信息(例如团队2将微服务D授权给微服务A访问);
此时该怎么办呢?
TIPS
有人可能会想:Eureka Server上哪有什么操作啊!整个Eureka Server的界面上,明明只有查看的能力!
如果只是查看,那当然没有问题,但要知道Eureka Server是有RESTful API的(详见 跟我学Spring Cloud(Finchley版)-06-服务注册与服务发现-Eureka深入 一节 )——举个例子,只需发送DELETE请求到
http://{username}:{password}@EUREKA_HOST:EUREKA_PORT/eureka/apps/{appId}/{instanceID}
,即可下线服务。如果线上微服务被恶意下线,那后果是不堪设想的。君不见,前两年携程删库事件造成股票大跌?
Spring Cloud抑或原生Eureka Server并未提供这一功能,只能由开发人员基于Spring Security或其他权限框架自行扩展。
这个扩展的成本还是比较高的,于是目前业界大多企业都放弃了扩展,转而采用管理手段防止无数据权限带来的风险。例如,生产环境中:
-
将Eureka Server的账号密码管控起来,只有核心成员才知晓。
TIPS
有人可能会想:这TM扯淡吧?我翻一下配置属性不知道账号密码了?后面会讲配置中心,配置中心可将账号密码等敏感数据加密存储。
-
将Eureka Server部署在一个隔离的网络中,人们无法直接访问到Eureka Server首页,必须借助跳板机等工具才能访问。
但不管怎么样,以上方式都会增加运维成本,同时也会带来不少沟通问题。
在笔者看来,体验最好、最直观、最完美的做法如下:
- 有完备的数据权限机制;
- 开发人员在一个Dashboard上可以查看、管理所有他有权管理的微服务(这里的Dashboard并不是指Eureka Server的界面,而是自己另外做的界面);
- 在Dashboard的某个地方能直接切换环境,例如一键切换开发、测试、生产环境等。
思路已经给出,实现也就是工作量的事情了。
相信聪明的看官们,对是放弃扩展,抑或追求完美一事,心里一定有了一些计较。
配套代码
- GitHub:
- microservice-discovery-eureka-authenticating:https://github.com/eacdy/spring-cloud-study/tree/master/2018-Finchley/microservice-discovery-eureka-authenticating
- Gitee:
- microservice-discovery-eureka-authenticating:https://gitee.com/itmuch/spring-cloud-study/tree/master/2018-Finchley/microservice-discovery-eureka-authenticating
相关文章
- 跟我学Spring Cloud(Finchley版)-05-服务注册与服务发现-Eureka入门
- 跟我学Spring Cloud(Finchley版)-06-服务注册与服务发现-Eureka深入
- 跟我学Spring Cloud(Finchley版)-04-服务注册与服务发现-原理剖析
- 关于Eureka 2.x,别再人云亦云了!
- Spring Cloud Alibaba迁移指南1:零代码从Eureka迁移到Nacos
相关推荐
spring-cloud-starter-netflix-eureka-server-1.4.5.RELEASE.jar
spring-cloud-starter-eureka-server-1.4.5.RELEASE.jar
良心demo,可以再学习的过程中参考一下,官网的教程是真的需要好好琢磨的,这个可以作为辅助参考,demo采用的版本均为最新版本:springcloud2.0-Finchley.SR1版本,大神提醒我一句学习springcloud不要想的太复杂,...
spring-cloud-netflix-eureka-server-1.4.5.RELEASE.jar
使用springboot搭建的一个基础服务框架,里面主要使用了netflix的eureka、ribbon,是个学习和了解的框架
基于Spring Cloud Finchley SR2 Spring Boot 2.0.7的最新版本。 核心基础项目内实现类自定义的权限注解,配合RBAC权限模型+拦截器即可实现权限的控制,具体的参考项目中的实现。同时也封装了一些顶层类和结果集等。...
Spring Cloud教程第一季-Spring Cloud Netflix-第03节-服务注册和服务发现-Eureka的深入了解
黑马程序员-SpringCloud-学习笔记-03-Eureka注册中心
SpringCloud-2.0-eureka-service-10000.zip 属于 eureka注册中心创建的源码
seata分布式事务demo
spring-cloud-config-eureka-bus:配置中心和消息总线示例(配置中心终结版) gateway-service-zuul:Spring Cloud Zuul使用初级篇 网关 均衡负载 spring-cloud-zuul:Spring Cloud Zuul使用高级篇 Filter 鉴权 熔断...
Eureka修改增加页面操作,用于多人开发测试操作流程。可以更好的进行协调操作,只需要替换本地仓库的jar包就行
最新版本的springcloud微服务实战,老版本与新版本差异较大,按照老的文章去使用新版本会有很多bug。
spring-cloud-config-eureka-refresh Spring Cloud(十)高可用的分布式配置中心 Spring Cloud Config 中使用 Refresh spring-cloud-config-bus-rabbitMQ Spring Cloud(十一)高可用的分布式配置中心 ...
spring-cloud-netflix-eureka-client-1.4.5.RELEASE.jar
spring-cloud-starter-netflix-eureka-server-2.1.0.RELEASE
spring-cloud-starter-netflix-eureka-client-2.1.0.RELEASE
spring-cloud-config-eureka-bus:配置中心和消息总线示例(配置中心终结版) gateway-service-zuul:Spring Cloud Zuul使用初级篇 网关 均衡负载 spring-cloud-zuul:Spring Cloud Zuul使用高级篇 Filter 鉴权 熔断...
解压文件--》 mvn clean package -->进入target目录,运行 java -jar *.jar
spring-cloud-netflix-eureka-server-2.1.0.RELEASE