Eureka集群+身份认证

注意 1:版本兼容

Finchley.SR1与Spring Boot 2.0.x 兼容,与Spring Boot 1.5.x 不兼容。
Finchley.SR1 依赖Spring Security 5(身份认真需要)

注意 2:Finchley.SR1应该没有依赖Eureka(也许我是错的,欢迎指指点点)
注意 3:Finchley.SR1与之前版本对身份认证的实现方案不同
注意4: CSRF攻击防御默认开启,所以会造成Eureka Client访问不到Server

看标题就能知道,这次只说一下实现内容,免得浪费没有需求的小伙伴的时间
1、Eureka集群
2、Eureka身份验证
在说一下目标:
1、实现登录Eureka的身份认证
2、实现Eureka Client向Server注册的身份认证
3、Eureka Server集群

从Eureka-Server开始

pom依赖–>因为两个Eureka Server依赖相同,所以依赖只贴着一次

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.1.RELEASE</version>
    </parent>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Finchley.SR1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <!--务必指定版本-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka-server</artifactId>
            <version>1.4.5.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
    </dependencies>

Eureka Server 1 的yml配置

spring:
  application:
    name: Eureka-Server

server:
  port: 8761

logging:
  level:
    com:
      netflix:
        eureka: OFF
        discovery: OFF

##########################################
# hosts设置
# 127.0.0.1       peer1
# 127.0.0.1       peer2
eureka:
  instance:
    hostname: peer1
  client:
#表示是否将自己注册在EurekaServer上,默认为true,集群必备。单节点为false
    register-with-eureka: true
#表示表示是否从EurekaServer获取注册信息,默认为true,集群必备。单节点为false
    fetch-registry: true
    service-url:
# 设置Eureka的地址
      defaultZone: http://${loginname}:${password}@peer2:8762/eureka

#SpringSecurity实现身份认证配置。在WebSecurityConfig中和设置Eureka的地址占位符使用
loginname: jack
password: 1111

Eureka Server 2 的yml配置

spring:
  application:
#Eureka集群的name需相同
    name: Eureka-Server

server:
  port: 8762

#日志
logging:
  level:
    com:
      netflix:
        eureka: OFF
        discovery: OFF

##########################################
# hosts设置
# 127.0.0.1       peer1
# 127.0.0.1       peer2
eureka:
  instance:
    hostname: peer2
  client:
#将自己注册在EurekaServer上,默认为true,集群必备。单节点为false
    register-with-eureka: true
#从EurekaServer获取注册信息,默认为true,集群必备。单节点为false
    fetch-registry: true
    service-url:
# 设置Eureka的地址
      defaultZone: http://${loginname}:${password}@peer1:8761/eureka

#SpringSecurity实现身份认证配置。在WebSecurityConfig中和设置Eureka的地址占位符使用
loginname: jack
password: 1111

两个yml配置异同我想很容易看出来,我觉得在看Eureka的同学应该都是有经验的程序员,所以我也就不多解释,而且注释也比较清楚。

下面是身份认证需要的配置类,两个Eureka Server相同。

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.factory.PasswordEncoderFactories;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;

import static org.springframework.security.core.userdetails.User.builder;

@Configuration
@EnableWebSecurity
@PropertySource(value = "classpath:application.yml")
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Value("${loginname}")
    private String name;
    @Value("${password}")
    private String password;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.NEVER);
        http.csrf().disable(); //关闭CSRF攻击防御,如不关闭,Eureka Client则会找不到Eureka Server而报异常。
        //注意:为了可以使用 http://${user}:${password}@${host}:${port}/eureka/ 这种方式登录,所以必须是httpBasic,如果是form方式,不能使用url格式登录
        http.authorizeRequests().anyRequest().authenticated().and().httpBasic();
    }

    @Bean
    public UserDetailsService userDetailsService() {
        //User.UserBuilder users = User.withDefaultPasswordEncoder(); // 此方法已经不推荐使用
        PasswordEncoder encoder = PasswordEncoderFactories.createDelegatingPasswordEncoder();
        User.UserBuilder var10000 = builder();
        encoder.getClass();
        User.UserBuilder users =  var10000.passwordEncoder(encoder::encode);

        InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
        manager.createUser(users.username(name).password(password).roles("USER").build());
        return manager;
    }

    /**
     * 此方式在 Edgware.SR4 可用,在Finchley.SR1中不可用
     */
    //    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        //        auth.inMemoryAuthentication().withUser("xiaohei").password("1111").roles("USER")
        //               .and().withUser("jackma").password("1111").roles("USER", "ADMIN");
    }
}

启动类。这里也只贴一份,仅是类名不同。

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@EnableEurekaServer
@SpringBootApplication
public class EurekaApplication {

    public static void main(String[] args) {
        SpringApplication.run(EurekaApplication.class, args);
    }
}

这样一来,当访问http://localhost:8761/时,就会提示需要身份验证了。

在这里插入图片描述

登录后:
在这里插入图片描述

Eureka客户端

1、依赖

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.1.RELEASE</version>
    </parent>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Finchley.SR1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>


    <dependencies>
        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
            <version>1.4.5.RELEASE</version>
        </dependency>
    </dependencies>

2、yml配置

spring:
  application:
    name: eureka-service-provider
server:
  port: 8081

###对应server配置类的用户名和密码
loginname: jack
password: 1111

#设置Eureka的地址
eureka:
  client:
    service-url:
      defaultZone: http://${loginname}:${password}@localhost:8761/eureka,http://${loginname}:${password}@localhost:8762/eureka

3、启动类

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

@EnableEurekaClient
 @SpringBootApplication
 public class EurekaClientApplication {

    public static void main(String[] args) {
        SpringApplication.run(EurekaClientApplication.class, args);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值