javascript
lumen认证中出现unauthorized._SpringBoot服务整合安全认证Security
前言
有這么個需求:客戶端不能直接訪問后端服務,需經過網關進行權鑒及安全認證后在將請求轉發到后端。但如果開發人員過用戶知道后端地址這個時候完全可以跳過網關服務直接請求到后端,這樣后端服務就會承受安全風險,這個時候我們就要用到Spring Security。
Spring Security簡介
Spring Security,這是一種基于 Spring AOP 和 Servlet 過濾器的安全框架。它提供全面的安全性解決方案,同時在 Web 請求級和方法調用級處理身份確認和授權。
SpringBoot集成Security
這里我們將Security單獨建立為一個核心微服務:microservice-security,這樣其他后端微服務執行引入這個jar就可以實現安全認證。
pom我們導入如下jar:
org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-security org.springframework.boot spring-boot-starter-data-couchbase同時我們編寫WebSecurityConfig類,該類繼承WebSecurityConfigurerAdapter,現通過以下方法可配置攔截URL,配置忽略認證地址及設置什么權限等安全控制。
@Configuration@EnableWebSecuritypublic 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授權。相關代碼片段如下:
@Componentpublic 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 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; }}至此我們完成了SpringBoot服務的權限認證。
總結
以上是生活随笔為你收集整理的lumen认证中出现unauthorized._SpringBoot服务整合安全认证Security的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 配置大升级!曝iPhone 15 Pro
- 下一篇: 爱立信CEO:印度是全球推出5G速度最快