解決eureka添加security權限驗證導致服務無法註冊到eureka上

1.在eureka項目application.yml中添加security配置

server:
  port: 8081     #默認端口8761
spring:
  security:
    user:
      name: admin  # 配置登錄的賬號是user
      password: admin #配置登錄的密碼是password123
eureka:
  client:
    register-with-eureka: false   #是否註冊到其他的eureka中
    fetch-registry: false    #是否合併其他eureka上的數據(獲取eureka註冊信息)
    service-url:
      #defaultZone: http://localhost:${server.port}/eureka #通信地址不可少
      defaultZone: http://admin:admin@localhost:8081/eureka

2.在eureka服務提供者項目中引入eureka註冊路徑

server:
  port: 8082
spring:
  application:
    name: 服務提供者                                #服務提供者名稱  英文字母建議使用小寫
  devtools:
    restart:
      additional-paths:  src/main/java
      enabled: true                               #熱部署生效
eureka:
  client:
    serviceUrl:
      defaultZone: http://admin:admin@localhost:8081/eureka  #eureka服務地址
  instance:
    prefer-ip-address: true      #顯示ip

3.此時啓動服務提供者項目會報錯

com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server
	at com.netflix.discovery.shared.transport.decorator.RetryableEurekaHttpClient.execute(RetryableEurekaHttpClient.java:112) ~[eureka-client-1.9.8.jar:1.9.8]
	at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.register(EurekaHttpClientDecorator.java:56) ~[eureka-client-1.9.8.jar:1.9.8]
	at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator$1.execute(EurekaHttpClientDecorator.java:59) ~[eureka-client-1.9.8.jar:1.9.8]
	at com.netflix.discovery.shared.transport.decorator.SessionedEurekaHttpClient.execute(SessionedEurekaHttpClient.java:77) ~[eureka-client-1.9.8.jar:1.9.8]
	at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.register(EurekaHttpClientDecorator.java:56) ~[eureka-client-1.9.8.jar:1.9.8]
	at com.netflix.discovery.DiscoveryClient.register(DiscoveryClient.java:829) ~[eureka-client-1.9.8.jar:1.9.8]
	at com.netflix.discovery.InstanceInfoReplicator.run(InstanceInfoReplicator.java:121) [eureka-client-1.9.8.jar:1.9.8]
	at com.netflix.discovery.InstanceInfoReplicator$1.run(InstanceInfoReplicator.java:101) [eureka-client-1.9.8.jar:1.9.8]
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [na:1.8.0_171]
	at java.util.concurrent.FutureTask.run(FutureTask.java:266) [na:1.8.0_171]
	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180) [na:1.8.0_171]
	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) [na:1.8.0_171]
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_171]
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_171]
	at java.lang.Thread.run(Thread.java:748) [na:1.8.0_171]

4.解決辦法:
在eureka項目中添加自定義security配置

@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    /**
     * @Description: 高版本的丟棄了
     * security:
     *   basic:
     *     enabled: true 配置,應該使用以下方式開啓
     * @Param: [http]
     * @Return: void
     */
    @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();
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章