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:pwd@localhost: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界面

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

#服務名稱
spring.application.name=service-client
#端口號
server.port=8762
#在註冊中心中進行註冊
eureka.client.serviceUrl.defaultZone=http://user:pwd@localhost: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。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章