12.04 SpringBoot服務整合安全認證Security


SpringBoot服務整合安全認證Security


前言

有這麼個需求:客戶端不能直接訪問後端服務,需經過網關進行權鑑及安全認證後在將請求轉發到後端。但如果開發人員過用戶知道後端地址這個時候完全可以跳過網關服務直接請求到後端,這樣後端服務就會承受安全風險,這個時候我們就要用到Spring Security。


SpringBoot服務整合安全認證Security


Spring Security簡介

Spring Security,這是一種基於 Spring AOP 和 Servlet 過濾器的安全框架。它提供全面的安全性解決方案,同時在 Web 請求級和方法調用級處理身份確認和授權。


SpringBoot服務整合安全認證Security


SpringBoot集成Security

這裡我們將Security單獨建立為一個核心微服務:microservice-security,這樣其他後端微服務執行引入這個jar就可以實現安全認證。

pom我們導入如下jar:

<dependencies>
<dependency>
<groupid>org.springframework.boot/<groupid>
<artifactid>spring-boot-starter-web/<artifactid>
/<dependency>
<dependency>
<groupid>org.springframework.boot/<groupid>
<artifactid>spring-boot-starter-security/<artifactid>
/<dependency>
<dependency>
<groupid>org.springframework.boot/<groupid>
<artifactid>spring-boot-starter-data-couchbase/<artifactid>
/<dependency>
/<dependencies>

同時我們編寫WebSecurityConfig類,該類繼承WebSecurityConfigurerAdapter,現通過以下方法可配置攔截URL,配置忽略認證地址及設置什麼權限等安全控制。

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

@Override
public void configure(WebSecurity web) {
String[] antPatterns = new String[] {
/** 忽略異步推送地址權鑑 */
"/v1/notifyUrl",
"/v1/faceLite/gainResultAndReturnUrl" };

/**忽略auth認證URL*/
web.ignoring().antMatchers(antPatterns);
}

@Override
protected void configure(HttpSecurity http) throws Exception {
/**表示所有的訪問都必須進行認證處理後才可以正常進行*/
http.httpBasic().and().authorizeRequests().anyRequest().fullyAuthenticated();
/**所有的Rest服務一定要設置為無狀態,以提升操作性能*/
http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
http.csrf().disable();
}

}

配置application-security.yml,設置安全認證密碼:

spring:
security:
user:
name: wxt12138
password: wxt12138
roles:
- USER
- ACTUATOR

通過上述三步我們編寫提供端微服務並引入microservice-security,注意提供端微服務application.yml配置需要引入security的配置文件:

spring:
profiles:
include:
- security

此時我們直接訪問提供端服務會出現401異常。

{
"timestamp": "2019-12-03T16:46:59.961+0000",
"status": 401,

"error": "Unauthorized",
"message": "Unauthorized",
"path": "/xxx/xxx"
}

此時我們的安全認證是已經生效,這時我們還需要配置gateway網關服務,網關服務中實現OAuth授權。相關代碼片段如下:

@Component
public class OAuthSignatureFilter implements GlobalFilter, Ordered {

/**授權訪問用戶名*/
@Value("${spring.security.user.name}")
private String securityUserName;
/**授權訪問密碼*/
@Value("${spring.security.user.password}")
private String securityUserPassword;

/**OAuth過濾器*/
@Override
public Mono<void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
/**oauth授權*/
String auth = securityUserName.concat(":").concat(securityUserPassword);
String encodedAuth = null;
try {
encodedAuth = Base64Utils.encode(auth.getBytes(Charset.forName("US-ASCII")));
} catch (UnsupportedEncodingException e) {
MySlf4j.textError("BASE64編碼異常:{0}",MySlf4j.ExceptionToString(e));
}
String authHeader = "Basic " + encodedAuth;
//向headers中放授權信息
ServerHttpRequest serverHttpRequest = exchange.getRequest().mutate().header("Authorization", authHeader)
.build();
//將現在的request變成change對象
ServerWebExchange build = exchange.mutate().request(serverHttpRequest).build();
return chain.filter(build);
}

/**優先級,數字越大優先級越低 */
@Override
public int getOrder() {
return 3;

}

}/<void>

至此我們完成了SpringBoot服務的權限認證。


分享到:


相關文章: