在網(wǎng)絡(luò)世界中,任何網(wǎng)絡(luò)中的服務(wù)都是不安全的,為了使我們的 Eureka 服務(wù)更加安全,我們可以添加各種各樣的認(rèn)證方式,以使客戶端在提供相應(yīng)的證明之后才能夠注冊(cè)到 Eureka 中。而這次我們就添加一個(gè)最基本的 Http Basic 認(rèn)證到 Eureka 中。 HTTP Basic 是簡單的用戶名密碼認(rèn)證,客戶端在發(fā)送注冊(cè)請(qǐng)求時(shí),會(huì)附帶用戶名和密碼一起發(fā)送到 Eureka Server,這種傳輸方式也屬于不×××全的一種。
專注于為中小企業(yè)提供網(wǎng)站建設(shè)、成都網(wǎng)站建設(shè)服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)汝陽免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了超過千家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
Gitee碼云
打開遠(yuǎn)程 git 倉庫中的 eureka-server.yml
文件,添加如下配置:
---
spring:
profiles: peer1
security:
user:
name: test
password: 123456
roles: USER
server:
port: 8761
eureka:
instance:
hostname: peer1
client:
register-with-eureka: false
fetch-registry: false
# serviceUrl:
# defaultZone: http://peer2:8762/eureka
---
為了簡化服務(wù)注冊(cè),我們這次測(cè)試只使用 peer1 這個(gè) profile,并且把 register-with-eureka
和 fetch-registry
設(shè)置為了 false 以關(guān)閉自身注冊(cè)。然后我們?cè)?spring
下配置了 security.user.name
,password
, roles
,分別用來指定可以登錄的用戶名,密碼,和用戶組。
在我們的 registry 項(xiàng)目中創(chuàng)建一個(gè) Java 類 cn.zxuqian.configurations.WebSecurityConfig
,并添加如下代碼:
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
private static Logger log = LoggerFactory.getLogger(WebSecurityConfig.class);
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable().httpBasic();
}
@Bean
public UserDetailsService userDetailsService() {
User.UserBuilder builder = User.withDefaultPasswordEncoder();
InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
manager.createUser(builder.username("test").password("123456").roles("USER").build());
return manager;
}
}
這里覆蓋了 WebSecurityConfigurerAdapter
中的 configure() 方法,用來停用 CSRF 保護(hù),因?yàn)槲覀兊?Eureka Server 使用了 peer
做為 hostname,而稍后測(cè)試的 product-service
使用了 localhost
,會(huì)被禁止訪問 Eureka 資源。然后在 userDetailsService()
方法中添加了一個(gè) test
用戶用于認(rèn)證。
打開遠(yuǎn)程 git 倉庫中的 product-service.yml
文件,添加如下配置:
eureka:
client:
serviceUrl:
defaultZone: http://test:123456@peer1:8761/eureka/
這里在 defaultZone
指定的 Url 中添加了 [username]:[password]@host:port/eureka/
形式的地址,此為 curl 發(fā)送用戶名和密碼的方式。
首先運(yùn)行 Config Server,然后使用 mvn spring-boot:run -Dspring-boot.run.profiles=peer1
運(yùn)行 Eureka Server,最后運(yùn)行 product-service
,稍等片刻就會(huì)看到 product-service
注冊(cè)成功,而 Eureka Server
的 log 中會(huì)有如下字樣(需設(shè)置 log level 為 debug):
2018-05-19 18:16:45.278 DEBUG 19055 --- [nio-8761-exec-9] w.c.HttpSessionSecurityContextRepository : Obtained a valid SecurityContext from SPRING_SECURITY_CONTEXT: 'org.springframework.security.core.context.SecurityContextImpl@442bd3dc: Authentication: org.springframework.security.authentication.UsernamePasswordAuthenticationToken@442bd3dc: Principal: org.springframework.security.core.userdetails.User@364492: Username: test; Password: [PROTECTED]; Enabled: true; AccountNonExpired: true; credentialsNonExpired: true; AccountNonLocked: true; Granted Authorities: ROLE_USER; Credentials: [PROTECTED]; Authenticated: true; Details: org.springframework.security.web.authentication.WebAuthenticationDetails@957e: RemoteIpAddress: 127.0.0.1; SessionId: null; Granted Authorities: ROLE_USER'
歡迎訪問我的博客:http://zxuqian.cn/