Eureka本身不具备安全认证的能力,Spring Cloud使用Spring Security为Eureka Server进行了增强。
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保护功能,否则应用无法正常注册!*/ @EnableWebSecurity public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.csrf().ignoringAntMatchers("/eureka/**"); super.configure(http); } }
测试
启动Eureka Server并访问http://localhost:8761
,可跳转至类似如下的登录页面:
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访问);
此时该怎么办呢?
有人可能会想:Eureka Server上哪有什么操作啊!整个Eureka Server的界面上,明明只有查看的能力!
如果只是查看,那当然没有问题,但要知道Eureka Server是有RESTful API的
举个例子,只需发送DELETE请求到http://{username}:{password}@EUREKA_HOST:EUREKA_PORT/eureka/apps/{appId}/{instanceID}
,即可下线服务。如果线上微服务被恶意下线,那后果是不堪设想的。
Spring Cloud抑或原生Eureka Server并未提供这一功能,只能由开发人员基于Spring Security或其他权限框架自行扩展。
这个扩展的成本还是比较高的,于是目前业界大多企业都放弃了扩展,转而采用管理手段防止无数据权限带来的风险。例如,生产环境中:
-
将Eureka Server的账号密码管控起来,只有核心成员才知晓。
- 配置中心可将账号密码等敏感数据加密存储。