javascript
lumen认证中出现unauthorized._SpringBoot服务整合安全认证Security
前言
有這么個(gè)需求:客戶端不能直接訪問后端服務(wù),需經(jīng)過網(wǎng)關(guān)進(jìn)行權(quán)鑒及安全認(rèn)證后在將請(qǐng)求轉(zhuǎn)發(fā)到后端。但如果開發(fā)人員過用戶知道后端地址這個(gè)時(shí)候完全可以跳過網(wǎng)關(guān)服務(wù)直接請(qǐng)求到后端,這樣后端服務(wù)就會(huì)承受安全風(fēng)險(xiǎn),這個(gè)時(shí)候我們就要用到Spring Security。
Spring Security簡(jiǎn)介
Spring Security,這是一種基于 Spring AOP 和 Servlet 過濾器的安全框架。它提供全面的安全性解決方案,同時(shí)在 Web 請(qǐng)求級(jí)和方法調(diào)用級(jí)處理身份確認(rèn)和授權(quán)。
SpringBoot集成Security
這里我們將Security單獨(dú)建立為一個(gè)核心微服務(wù):microservice-security,這樣其他后端微服務(wù)執(zhí)行引入這個(gè)jar就可以實(shí)現(xiàn)安全認(rèn)證。
pom我們導(dǎo)入如下jar:
org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-security org.springframework.boot spring-boot-starter-data-couchbase同時(shí)我們編寫WebSecurityConfig類,該類繼承WebSecurityConfigurerAdapter,現(xiàn)通過以下方法可配置攔截URL,配置忽略認(rèn)證地址及設(shè)置什么權(quán)限等安全控制。
@Configuration@EnableWebSecuritypublic class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Override public void configure(WebSecurity web) { String[] antPatterns = new String[] { /** 忽略異步推送地址權(quán)鑒 */ "/v1/notifyUrl", "/v1/faceLite/gainResultAndReturnUrl" }; /**忽略auth認(rèn)證URL*/ web.ignoring().antMatchers(antPatterns); } @Override protected void configure(HttpSecurity http) throws Exception { /**表示所有的訪問都必須進(jìn)行認(rèn)證處理后才可以正常進(jìn)行*/ http.httpBasic().and().authorizeRequests().anyRequest().fullyAuthenticated(); /**所有的Rest服務(wù)一定要設(shè)置為無狀態(tài),以提升操作性能*/ http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS); http.csrf().disable(); }}配置application-security.yml,設(shè)置安全認(rèn)證密碼:
spring: security: user: name: wxt12138 password: wxt12138 roles: - USER - ACTUATOR通過上述三步我們編寫提供端微服務(wù)并引入microservice-security,注意提供端微服務(wù)application.yml配置需要引入security的配置文件:
spring: profiles: include: - security此時(shí)我們直接訪問提供端服務(wù)會(huì)出現(xiàn)401異常。
{ "timestamp": "2019-12-03T16:46:59.961+0000", "status": 401, "error": "Unauthorized", "message": "Unauthorized", "path": "/xxx/xxx"}此時(shí)我們的安全認(rèn)證是已經(jīng)生效,這時(shí)我們還需要配置gateway網(wǎng)關(guān)服務(wù),網(wǎng)關(guān)服務(wù)中實(shí)現(xiàn)OAuth授權(quán)。相關(guān)代碼片段如下:
@Componentpublic class OAuthSignatureFilter implements GlobalFilter, Ordered { /**授權(quán)訪問用戶名*/ @Value("${spring.security.user.name}") private String securityUserName; /**授權(quán)訪問密碼*/ @Value("${spring.security.user.password}") private String securityUserPassword; /**OAuth過濾器*/ @Override public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) { /**oauth授權(quán)*/ 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中放授權(quán)信息 ServerHttpRequest serverHttpRequest = exchange.getRequest().mutate().header("Authorization", authHeader) .build(); //將現(xiàn)在的request變成change對(duì)象 ServerWebExchange build = exchange.mutate().request(serverHttpRequest).build(); return chain.filter(build); } /**優(yōu)先級(jí),數(shù)字越大優(yōu)先級(jí)越低 */ @Override public int getOrder() { return 3; }}至此我們完成了SpringBoot服務(wù)的權(quán)限認(rèn)證。
總結(jié)
以上是生活随笔為你收集整理的lumen认证中出现unauthorized._SpringBoot服务整合安全认证Security的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 配置大升级!曝iPhone 15 Pro
- 下一篇: js多层对象数组 合并_13个你必须知道