spingboot 集成identityserver4身份验证

一、新建项目:com.saas.swaggerdemo

详情见:spring-boot2.7.8添加swagger-CSDN博客

在之前项目基础上添加如下依赖

       <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 {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("jwk公钥解析验证授权...");}@Overridepublic 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];}@Overridepublic void destroy() {}
}

添加 @ServletComponentScan

 三、准备Identityserver4Server

三、测试

Postman带上Token调用接口

  获取到用户ID

使用过期或无效的token

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/417409.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何用“CentOS7 安装Mysql”?

1、 yum安装更方便 yum install wget 2、 新建文件夹 [rootlocalhost bin]# cd /usr/local/ [rootlocalhost local]# mkdir mysql [rootlocalhost local]# cd mysql [rootlocalhost mysql]# 3、 下载并安装MySQL官方的 Yum Repository wget http://dev.mysql.com/get/mys…

Docker-安装实践(mysql,redis集群,tomcat)

docker实践(提供几个安装案例&#xff09; 安装Tomcat # 拉取镜像,可以指定标签不指定默认为最新 docker pull tomcat docker run -itd -p 8080:8080 --name tomcat tomcat:latest #这样内部默认80端口&#xff0c;主机的映射端口会随机分配一个 docker run -itd -P tomcat…

【HarmonyOS】掌握布局组件,提升应用体验

从今天开始&#xff0c;博主将开设一门新的专栏用来讲解市面上比较热门的技术 “鸿蒙开发”&#xff0c;对于刚接触这项技术的小伙伴在学习鸿蒙开发之前&#xff0c;有必要先了解一下鸿蒙&#xff0c;从你的角度来讲&#xff0c;你认为什么是鸿蒙呢&#xff1f;它出现的意义又是…

【每日一题】—— A. Chemistry(900分思维)

&#x1f30f;博客主页&#xff1a;PH_modest的博客主页 &#x1f6a9;当前专栏&#xff1a;每日一题 &#x1f48c;其他专栏&#xff1a; &#x1f534; 每日反刍 &#x1f7e1; C跬步积累 &#x1f7e2; C语言跬步积累 &#x1f308;座右铭&#xff1a;广积粮&#xff0c;缓称…

Linux 查看时区及修改时区的方法

查看时区 ll /etc/localtime可以看到这里显示的是纽约的时区 修改时区 timedatectl set-timezone Asia/Shanghai如图所示&#xff0c;表示修改成功为上海时区

每日一题——LeetCode1287.有序数组中出现次数超过25%的元素

方法一 一次循环统计 题目给出的数据相同的元素都是相邻的&#xff0c;那么直接从头开始遍历&#xff0c;统计每种元素出现次数&#xff0c;当有元素次数超过arr.length/4即为要求的元素 var findSpecialInteger function(arr) {let countMath.floor(arr.length/4),num1conso…

【涨薪技术】掌握加密签名接口测试实战!

接口加密是指在网络传输过程中&#xff0c;将数据进行加密&#xff0c;以保护数据的安全性。接口加密可以采用多种加密算法&#xff0c;如AES、DES、RSA等。测试接口加密的目的是验证接口加密算法的正确性和安全性。 1加密与加密算法 加密&#xff08;Encrypt&#xff09;是将…

Linux问题 apt-get install时 无法解析域名“cn.archive.ubuntu.com”

问题描述: 在安装程序时会出现无法解析域名的错误 解决办法: 1、编辑文件 sudo vim /etc/resolv.conf 2、在最后加上(按键 i 进入编辑模式) nameserver 8.8.8.8 3、保存退出(:wq)

使用 FFmpeg 轻松调整视频的大小/缩放/更改分辨率

在此 FFmpeg 教程中&#xff0c;我们学习使用 FFmpeg 的命令行工具更改视频的分辨率&#xff08;或调整视频的大小/缩放&#xff09;。 更改视频的分辨率&#xff08;也称为调整大小或缩放&#xff09;是视频编辑、处理和压缩中非常常见的操作。对于 ABR 视频流尤其如此&#…

深入解析JavaScript中的var、let和const

&#x1f9d1;‍&#x1f393; 个人主页&#xff1a;《爱蹦跶的大A阿》 &#x1f525;当前正在更新专栏&#xff1a;《VUE》 、《JavaScript保姆级教程》、《krpano》、《krpano中文文档》 ​ ​ ✨ 前言 变量的声明是编程中非常基础和关键的概念。在ES6之前,JavaScript只有…

力扣:474. 一和零(动态规划)(01背包)

题目&#xff1a; 给你一个二进制字符串数组 strs 和两个整数 m 和 n 。 请你找出并返回 strs 的最大子集的长度&#xff0c;该子集中 最多 有 m 个 0 和 n 个 1 。 如果 x 的所有元素也是 y 的元素&#xff0c;集合 x 是集合 y 的 子集 。 示例 1&#xff1a; 输入&#…

内存分析CE寻找天龙八部人物状态及基址

扫描类型为未知的数值首次扫描 通过改变角色状态 扫描类型变动的数值和未变动的数值扫描地址 选择3FCBD25C为人物状态地址 0站立 2走路 6打坐 7打怪 找基址 鼠标右键找出是什么访问了这个地址 查看第一个的详细信息 与02 和 00 进行判断&#xff08;走路和站立&#…