springboot?集成identityserver4身份驗證的過程解析
一、新建項目:com.saas.swaggerdemo
在之前項目基礎(chǔ)上添加如下依賴
<dependency> <groupId>com.nimbusds</groupId> <artifactId>nimbus-jose-jwt</artifactId> <version>7.9</version> </dependency> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpcore</artifactId> <version>4.4.10</version> </dependency> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.6</version> </dependency> <dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> <version>1.11</version> </dependency> <dependency> <groupId>org.json</groupId> <artifactId>json</artifactId> <version>20180813</version> </dependency>
二、添加過濾器JwkFilter
package com.saas.swaggerdemo; import com.nimbusds.jose.proc.BadJOSEException; import com.nimbusds.jose.proc.SecurityContext; import org.json.JSONObject; import javax.servlet.*; import javax.servlet.annotation.WebFilter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.net.URL; import java.text.ParseException; import com.nimbusds.jose.*; import com.nimbusds.jose.jwk.source.*; import com.nimbusds.jwt.*; import com.nimbusds.jose.proc.JWSKeySelector; import com.nimbusds.jose.proc.JWSVerificationKeySelector; import com.nimbusds.jwt.proc.*; @WebFilter(urlPatterns = "/*", filterName="jwkTokenFilter") public class JwkFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("jwk公鑰解析驗證授權(quán)..."); } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { boolean authenticated = false; HttpServletRequest req = (HttpServletRequest) servletRequest; HttpServletResponse rep = (HttpServletResponse) servletResponse; boolean authorizationHeaderExist = req.getHeader("Authorization") != null; if (!authorizationHeaderExist) { rep.setStatus(HttpServletResponse.SC_BAD_REQUEST); return; } String jwkEndpoint = "http://192.168.31.132:7000/.well-known/openid-configuration/jwks"; String token = cutToken(req.getHeader("Authorization")); ConfigurableJWTProcessor jwtProcessor = new DefaultJWTProcessor(); JWKSource keySource = new RemoteJWKSet(new URL(jwkEndpoint)); JWSAlgorithm expectedJWSAlg = JWSAlgorithm.RS256; JWSKeySelector keySelector = new JWSVerificationKeySelector(expectedJWSAlg, keySource); if(keySelector==null) { rep.setStatus(HttpServletResponse.SC_UNAUTHORIZED); System.out.println("無法獲取公鑰"); return; } jwtProcessor.setJWSKeySelector(keySelector); SecurityContext ctx = null; JWTClaimsSet claimsSet = null; try { claimsSet = jwtProcessor.process(token, ctx); authenticated = true; } catch (ParseException e) { rep.setStatus(HttpServletResponse.SC_UNAUTHORIZED); e.printStackTrace(); return; } catch (BadJOSEException e) { rep.setStatus(HttpServletResponse.SC_UNAUTHORIZED); e.printStackTrace(); return; } catch (JOSEException e) { rep.setStatus(HttpServletResponse.SC_UNAUTHORIZED); e.printStackTrace(); return; } System.out.println(claimsSet.toJSONObject()); if(claimsSet==null) { rep.setStatus(HttpServletResponse.SC_UNAUTHORIZED); return; } JSONObject jo = new JSONObject(claimsSet.toJSONObject()); String userid = jo.getString("userid"); if (authenticated) { filterChain.doFilter(servletRequest, servletResponse); } else { rep.setStatus(HttpServletResponse.SC_UNAUTHORIZED); return; } } //幫助類 public String cutToken(String originToken) { String[] temp = originToken.split(" "); return temp[1]; } @Override public void destroy() { } }
添加 @ServletComponentScan
三、準(zhǔn)備Identityserver4Server
三、測試
Postman帶上Token調(diào)用接口
獲取到用戶ID
使用過期或無效的token
到此這篇關(guān)于springboot 集成identityserver4身份驗證的文章就介紹到這了,更多相關(guān)springboot 集成identityserver身份驗證內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決因缺少Log4j依賴導(dǎo)致應(yīng)用啟動失敗的問題
日志是應(yīng)用軟件中不可缺少的部分,Apache的開源項目log4j是一個功能強大的日志組件,提供方便的日志記錄。但這篇文章不是介紹Log4j,這篇文章主要介紹了關(guān)于因缺少Log4j依賴導(dǎo)致應(yīng)用啟動失敗問題的相關(guān)資料,需要的朋友可以參考下。2017-04-04SpringBoot @PathVariable使用時遇到的問題及解決
這篇文章主要介紹了SpringBoot @PathVariable使用時遇到的問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10IDEA 2020.3.X 創(chuàng)建scala環(huán)境的詳細教程
這篇文章主要介紹了IDEA 2020.3.X 創(chuàng)建scala環(huán)境的詳細教程,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-04-04IntelliJ IDEA修改新建文件自動生成注釋的user名
今天小編就為大家分享一篇關(guān)于IntelliJ IDEA修改新建文件自動生成注釋的user名,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-10-10據(jù)說這個是可以擼到2089年的idea2020.2(推薦)
這篇文章主要介紹了據(jù)說這個是可以擼到2089年的idea2020.2,本教程給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-09-09Java將字符串轉(zhuǎn)化為數(shù)組的兩種方法
Java中的String類是一種特殊的字符串,它可以被用于處理字符串,Java中的String類也可以將字符串轉(zhuǎn)換為數(shù)組,下面這篇文章主要給大家介紹了關(guān)于Java將字符串轉(zhuǎn)化為數(shù)組的兩種方法,需要的朋友可以參考下2023-05-05java數(shù)據(jù)結(jié)構(gòu)之希爾排序
這篇文章主要為大家詳細介紹了java數(shù)據(jù)結(jié)構(gòu)之希爾排序的相關(guān)代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-11-11