Eureka Server 开启身份验证

目录

前言

Eureka Server 开启身份验证

pom.xml

application.yml

WebSecurityConfig 开启 CSRF 防护

启动测试

Eureka Client 注册到服务中心

pom.xml

启动测试


前言

1、《 Spring Boot 搭建 Eureka Servrer · 单机模式》成功搭建了 Eureka Server,启动应用之后,浏览器输入 http://ip:port/context-path 便自动进入 Spring Eureka 主页了。

2、然而对于 Eureka Server 服务注册中心而言,为了安全,显然很多时候是不允许别人这样直接进入的,就像 tomcat 服务器的主页一样,如果谁都可以随便进入,则始终是个安全隐患。

3、Spring Cloud Netflix 官网提供了在 Eureka Server 端配置身份验证,这样以后想进入整个 Eureka Server 应用的时候,会自动跳转到登录页面,用户登录成功,方可访问。

服务端配置官网文档:Securing The Eureka Server

客户端配置官网文档:Authenticating with the Eureka Server

Eureka Server 开启身份验证

1、环境:Java JDK 1.8 + Spring Boot 2.1.3 + Spring Cloud(Greenwich.RELEASE) + Maven 3.5.2 + Eureka 2.1.0 + IDEA 14.

2、注意:使用的是最新版的 Spring Cloud(Greenwich),老版本可能略有差异

3、这里以《Spring Boot 搭建 Eureka Servrer · 单机模式》中的项目继续改写,为其追加身份验证。

pom.xml

1、按着官网“Securing The Eureka Server” 的介绍第一步应该导入 spring-boot-starter-security 组件,将 security 添加到服务器的类路径来保护 Eureka 服务器。

2、在《Spring Boot 搭建 Eureka Servrer · 单机模式》的 pom.xml 文件基础上加上 spring security 组件:

<!-- spring 身份验证组件,如果单纯的只是对 Eureka Server 连接时进行身份验证,Eureka Client 端可以不用导入此组件-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

application.yml

1、第二步就是在全局配置文件中添加配置,如下所示身份验证是其中的第 10-15 行,这些配置都可以在官网示例中找到。

#配置服务器
server:
  port: 8761  #也可以改为其它端口,如 8080、80,不一定要使用 Eureka 的默认端口 8761

#配置 spring
spring:
  freemarker:  #设置 freemarker 模板引擎,不从文件系统加载模板,当导入 Thymeleaf 模板时,必须设置此项
    template-loader-path: classpath:/templates/
    prefer-file-system-access: false
  security:  #设置 Eureka Server 身份验证,注意是以 spring 开头,spring.security
      basic:
        enabeld: true #启用身份验证
      user:
        name: zhangSan #登录账号
        password: zhangSan2018 #登录密码

#配置 Eureka Server
eureka:
  client:
    registerWithEureka: false  #禁用自己向自己注册
    fetchRegistry: false   #不同步其他的 Eureka Server节点的数据
    serviceUrl:
      defaultZone: http://zhangSan:zhangSan2018@localhost:${server.port}/eureka #账号密码必须与上面的一致

2、身份验证时,其中的 eureka.client.serviceUrl.defaultZone 配置详解如下:

1)身份验证时 defaultZone 的格式为:http://账号:密码@ip:端口/context-path/请求地址

2、如上所示将账号与密码直接写死在 defaultZone 地址中了,推荐使用下面 ${xxx} 动态获取文件中其它属性值的方式:

defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@localhost:${server.port}/eureka

3、defaultZone 中的 @localhost 表示 Eureka Server 自己的 IP 地址,所以也可以是 @127.0.0.1 或者 @192.168.1.20(自己的ip)

4、一旦添加了 spring security 组件,则配置文件中必须配置账号密码,因为它一旦导入,就默认已经开启了验证。

WebSecurityConfig 开启 CSRF 防护

1、官网“Securing The Eureka Server” 中提到:

默认情况下,当 spring security 在类路径上时,它要求用户向应用程序发送请求时,都必须携带一个有效的 csrf 令牌,而 Eureka 客户端通常不会拥有有效的跨站点请求(CSRF)令牌,此时 Eureka Serer 端应该对 eureka 的请求路径放行。

举例如下:

@EnableWebSecurity
class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().ignoringAntMatchers("/eureka/**");
        super.configure(http);
    }
}

2、关于 CSRF 防护简单介绍如下:

CSRF(Cross-site request forgery) 是指跨站请求伪造,是 web 常见的攻击之一,从 Spring Security 4.0 开始,默认情况下 security 会启用 CSRF 保护,以防止 CSRF 攻击应用程序。

可以参考《spring security CSRF防护

3、有一点必须注意:这里的身份验证与这个 CSRF 跨站请求伪造防护是两码事,身份验证指的是登录系统时必须先登录,而 CSRF 防护是要求请求时携带一个 CSRF 令牌。

4、意思已经很明确了,就是 Spring Security 要求用户访问的请求的时候,必须携带一个 跨站点请求(CSRF)令牌,而显然 Eureka Client 要么就是能提供这个令牌,要么就是在 Eureka Server 直接忽略掉 Eureka Client 的请求,也就是不对这些请求进行防护。

5、在《Spring Boot 搭建 Eureka Servrer · 单机模式》中新建此配置类:

/**
 * Created by Administrator on 2019/3/7 0007.
 * EnableWebSecurity :表示开启 web 安全验证,继承 WebSecurityConfigurerAdapter ,然后覆盖默认的配置
 * 将本配置类放在与启动类同级,则程序一启动就会自动执行
 */
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        /**
         * ignoringAntMatchers(String... antPatterns):表示对某些请求,如果符合匹配的规则,则忽略对它们的 CSRF 防护
         * /eureka/**:首斜杠表示应用上下文路径,也就是说对所有符合 http://ip:port/context-paht/eureka/** 的请求全部忽略对它们的 CSRF 防护
         * 所以只要 eureka.client.serviceUrl.defaultZone 的值符合此规则,就不会被 CSRF 防护了
         */
        http.csrf().ignoringAntMatchers("/eureka/**");
        /**
         * 还有一个一劳永逸的方式是直接禁止  CSRF 防护:
         * http.csrf().disable();//完全禁止 CSRF 防护
         */
        super.configure(http);
    }
}

启动测试

1、至此 Eureka Server 端编写完成,第一步导入 spring security 组件,第二步配置身份验证,第三步忽略 csrf 防护,现在启动应用。

Eureka Client 注册到服务中心

1、这里以《Eureka-Client 注册服务到 Eureka-Server》为基础进行追加改写。

2、环境:Java JDK 1.8 + Spring Boot 2.1.3 + Spring Cloud(Greenwich.RELEASE) + Maven 3.5.2 + Eureka 2.1.0 + IDEA 14.

3、当 Eureka Server 端开启身份验证之后,Eureka Client 端肯定也要有相应的变化,否则是注册不上的。

4、Eureka Client 很简单,根据官网“ Authenticating with the Eureka Server” 的说明,只需要改写 eureka.client.serviceUrl.defaultZone 一项配置即可。(Eureka Client 端可以不导入 spring-boot-starter-security 组件)

如果客户端 eureka.client.serviceurl.defaultzone 的 urls 中嵌入了凭据,如下所示:

 http://user:password@localhost:8761/eureka

则会自动将 HTTP 基本身份验证添加到 eureka 客户端。其中这种写法官方叫 "curl style"。

pom.xml

1、修改《Eureka-Client 注册服务到 Eureka-Server》的 pom.xml 文件如下:

#配置服务器
server:
  port: 8787

#配置 Eureka Client
eureka:
  client:
    serviceUrl:
      defaultZone: http://zhangSan:[email protected]:8761/eureka #账号密码必须和服务端提供的一致,ip必须指向服务端

Eureka Server 开启身份验证后,服务端和客户端的 defaultZone 的值都是 curl 风格写法:

格式:http://账号:密码@Eureka Server端IP:Eureka Server端port/Eureka Server端应用上下文件/请求地址

启动测试

至此完成,服务端身份验证成,客户端也成功注册。

最后提醒一遍,服务端必须忽略 Eureka Client 的 CSRF 防护,否则客户端会注册不上服务。

猜你喜欢

转载自blog.csdn.net/wangmx1993328/article/details/88346063
今日推荐