天天看點

SpringCloud三:給EurekaServer加入安全認證

1.在properties中加入對應的配置

#注冊中心服務ID
spring.application.name=eureka-server

eureka.instance.hostname=localhost
#端口号
server.port=8761
# eureka.client.registerWithEureka :表示是否将自己注冊到Eureka Server,預設為true。
# 由于目前這個應用就是Eureka Server,故而設為false
eureka.client.register-with-eureka=false
# eureka.client.fetchRegistry :表示是否從Eureka Server擷取注冊資訊,預設為true。因為這是一個單點的Eureka Server,
# 不需要同步其他的Eureka Server節點的資料,故而設為false。
eureka.client.fetch-registry=false
#添加認證的賬号密碼
spring.security.user.name=user
spring.security.user.password=pwd
# eureka.client.serviceUrl.defaultZone :設定與Eureka Server互動的位址,查詢服務和注冊服務都需要依賴這個位址。預設是
#eureka.client.serviceUrl.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka
#http://user:[email protected]:8761/eureka/
eureka.client.serviceUrl.defaultZone=http://${spring.security.user.name}:${spring.security.user.password}@${eureka.instance.hostname}:${server.port}/eureka/ 

#Eureka Server在運作期間,會統計心跳失敗的比例在15分鐘之内是否低于85%,
# Eureka Server會将目前的執行個體注冊資訊保護起來,同時提示警告。
#關閉自我保護僅允許在測試環境,false關閉
#eureka.server.enableSelfPreservation=true
           

2.添加對應的pom

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-security</artifactId>
</dependency>
           

3.啟動EurekaServer後在浏覽器中http://localhost:8761會自動跳轉到http://localhost:8761/login界面,輸入對應的賬号密碼進入EurekaServer界面

SpringCloud三:給EurekaServer加入安全認證

4.加入安全認賬後,需要同步修改用戶端的url

#服務名稱
spring.application.name=service-client
#端口号
server.port=8762
#在注冊中心中進行注冊
eureka.client.serviceUrl.defaultZone=http://user:[email protected]:8761/eureka/
#啟動服務發現的功能,開啟了才能調用其它服務
#spring.cloud.config.discovery.enabled=true
#發現的服務的名字--對應注測中心的服務名字
#spring.cloud.config.discovery.serviceId=eurka-server
           

5.修改完成後啟動用戶端向Eureka注冊時會報Cannot execute request on any known server錯誤。

DiscoveryClient_SERVICE-CLIENT/WIN10-20171114L:service-client:8762 - registration failed 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:112) ~[eureka-client-1.9.2.jar:1.9.2]
	at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.register(EurekaHttpClientDecorator.java:56) ~[eureka-client-1.9.2.jar:1.9.2]
	at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator$1.execute(EurekaHttpClientDecorator.java:59) ~[eureka-client-1.9.2.jar:1.9.2]
	at com.netflix.discovery.shared.transport.decorator.SessionedEurekaHttpClient.execute(SessionedEurekaHttpClient.java:77) ~[eureka-client-1.9.2.jar:1.9.2]
	at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.register(EurekaHttpClientDecorator.java:56) ~[eureka-client-1.9.2.jar:1.9.2]
	at com.netflix.discovery.DiscoveryClient.register(DiscoveryClient.java:829) ~[eureka-client-1.9.2.jar:1.9.2]
	at com.netflix.discovery.InstanceInfoReplicator.run(InstanceInfoReplicator.java:121) [eureka-client-1.9.2.jar:1.9.2]
	at com.netflix.discovery.InstanceInfoReplicator$1.run(InstanceInfoReplicator.java:101) [eureka-client-1.9.2.jar:1.9.2]
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [na:1.8.0_141]
	at java.util.concurrent.FutureTask.run(FutureTask.java:266) [na:1.8.0_141]
	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180) [na:1.8.0_141]
	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) [na:1.8.0_141]
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_141]
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_141]
	at java.lang.Thread.run(Thread.java:748) [na:1.8.0_141]
           

在這裡我找到了解決的辦法 https://blog.csdn.net/yakson/article/details/80860394

在eurka服務中添加一個安全認證類。

@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();
    }
}
           

重新開機注冊中心後,用戶端就可以向注冊中心注冊節點了。

這裡用到的版本是Spring Boot2.0.3.RELEASE,Spring CloudFinchley.RELEASE。

繼續閱讀