注意 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);
}
}