為 Eureka 新增 Http Basic 認證

張旭乾發表於2019-03-01

簡介

在網路世界中,任何網路中的服務都是不安全的,為了使我們的 Eureka 服務更加安全,我們可以新增各種各樣的認證方式,以使客戶端在提供相應的證明之後才能夠註冊到 Eureka 中。而這次我們就新增一個最基本的 Http Basic 認證到 Eureka 中。 HTTP Basic 是簡單的使用者名稱密碼認證,客戶端在傳送註冊請求時,會附帶使用者名稱和密碼一起傳送到 Eureka Server,這種傳輸方式也屬於不太安全的一種。

專案原始碼

Gitee碼雲

配置 Eureka Server

開啟遠端 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

---
複製程式碼

為了簡化服務註冊,我們這次測試只使用 peer1 這個 profile,並且把 register-with-eurekafetch-registry 設定為了 false 以關閉自身註冊。然後我們在 spring 下配置了 security.user.namepassword, roles,分別用來指定可以登入的使用者名稱,密碼,和使用者組。

在我們的 registry 專案中建立一個 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 保護,因為我們的 Eureka Server 使用了 peer 做為 hostname,而稍後測試的 product-service 使用了 localhost,會被禁止訪問 Eureka 資源。然後在 userDetailsService() 方法中新增了一個 test 使用者用於認證。

Product-service

開啟遠端 git 倉庫中的 product-service.yml 檔案,新增如下配置:

eureka:
  client:
    serviceUrl:
      defaultZone: http://test:123456@peer1:8761/eureka/
複製程式碼

這裡在 defaultZone 指定的 Url 中新增了 [username]:[password]@host:port/eureka/ 形式的地址,此為 curl 傳送使用者名稱和密碼的方式。

測試

首先執行 Config Server,然後使用 mvn spring-boot:run -Dspring-boot.run.profiles=peer1 執行 Eureka Server,最後執行 product-service,稍等片刻就會看到 product-service 註冊成功,而 Eureka Server 的 log 中會有如下字樣(需設定 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`

複製程式碼

歡迎訪問我的部落格:zxuqian.cn/

相關文章