为服务注册中心eureka server—添加Security用户认证
本文中示例代码的引用版本:
org.springframework.boot 版本 :2.1.0.RELEASE
org.springframework.cloud 版本:Greenwich.M1
示例代码-码云 https://gitee.com/sharps/springcloud
在spring-cloud-eureka服务注册中心项目的基础上增加用户认证。
1、添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
2、修改application.properties文件
spring.application.name=spring-cloud-eureka
server.port=8000
eureka.instance.hostname=localhost
eureka.instance.prefer-ip-address=false
#表示是否将自己注册到Eureka Server,默认为true。
eureka.client.register-with-eureka=false
#表示是否从Eureka Server获取注册信息,默认为true。
eureka.client.fetch-registry=false
#开启基于HTTP basic的认证----高版本的丢弃了这个属性默认false,查看第3段开启方法。
spring.security.basic.enabled=true
#配置登陆的账号
spring.security.user.name=user
#配置登陆的密码
spring.security.user.password=123456
#设置与Eureka Server交互的地址,查询服务和注册服务都需要依赖这个地址。默认是http://localhost:8761/eureka ;多个地址可使用 , 分隔。
eureka.client.serviceUrl.defaultZone=http://localhost:${server.port}/eureka/
访问:http://localhost:8000/弹出对话框
如何将服务注册到Eureka上呢?只需在客户端配置文件做如下修改
eureka.client.serviceUrl.defaultZone=http://user:123456@localhost:8000/eureka/
***对于更复杂的要求,可以创建一个类型为DiscoveryClientOptionalArgs的@Bean,并向其中注入ClientFilter
3、开启基于HTTP basic的认证方法:
处理客户端无法注册到服务中心的问题 Cannot execute request on any known server 错误。
com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server
at com.netflix.discovery.shared.transport.decorator.RetryableEurekaHttpClient.execute(RetryableEurekaHttpClient.java:111) ~[eureka-client-1.8.6.jar:1.8.6]
at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.register(EurekaHttpClientDecorator.java:56) ~[eureka-client-1.8.6.jar:1.8.6]
at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator$1.execute(EurekaHttpClientDecorator.java:59) ~[eureka-client-1.8.6.jar:1.8.6]
at com.netflix.discovery.shared.transport.decorator.SessionedEurekaHttpClient.execute(SessionedEurekaHttpClient.java:77) ~[eureka-client-1.8.6.jar:1.8.6]
at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.register(EurekaHttpClientDecorator.java:56) ~[eureka-client-1.8.6.jar:1.8.6]
高版本的丢弃了spring.security.basic.enabled这个属性,默认false那么如何开启呢?方法如下
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
/**
* 高版本的丢弃了
*
* security:
* basic:
* enabled: true
*
* 配置,应该使用以下方式开启
*
* @param http
* @throws Exception
*/
@Override
protected void configure(HttpSecurity http) throws Exception {
// Configure HttpSecurity as needed (e.g. enable http basic).
http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.NEVER);
http.csrf().disable();
//注意:为了可以使用 http://${user}:${password}@${host}:${port}/eureka/ 这种方式登录,所以必须是httpBasic,
// 如果是form方式,不能使用url格式登录
http.authorizeRequests().anyRequest().authenticated().and().httpBasic();
}