spingboot 集成identityserver4身份验证

这篇具有很好参考价值的文章主要介绍了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 {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("jwk公钥解析验证授权...");
    }
    @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

spingboot 集成identityserver4身份验证,Java,java

 三、准备Identityserver4Server

spingboot 集成identityserver4身份验证,Java,java

三、测试

spingboot 集成identityserver4身份验证,Java,java

Postman带上Token调用接口

spingboot 集成identityserver4身份验证,Java,java

spingboot 集成identityserver4身份验证,Java,java  获取到用户ID

spingboot 集成identityserver4身份验证,Java,java

使用过期或无效的token

spingboot 集成identityserver4身份验证,Java,java文章来源地址https://www.toymoban.com/news/detail-811406.html

到了这里,关于spingboot 集成identityserver4身份验证的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Blazor入门100天 : 身份验证和授权 (1) - 建立带身份验证工程

    目录 建立默认带身份验证 Blazor 程序 角色/组件/特性/过程逻辑 DB 改 Sqlite 将自定义字段添加到用户表 脚手架拉取IDS文件,本地化资源 freesql 生成实体类,freesql 管理ids数据表 初始化 Roles,freesql 外键 = 导航属性 完善 freesql 和 bb 特性 知识点 Microsoft.AspNetCore.Identity EntityFramework Sql

    2024年02月05日
    浏览(76)
  • Java21 + SpringBoot3集成easy-captcha实现验证码显示和登录校验

    近日心血来潮想做一个开源项目,目标是做一款可以适配多端、功能完备的模板工程,包含后台管理系统和前台系统,开发者基于此项目进行裁剪和扩展来完成自己的功能开发。 本项目为前后端分离开发,后端基于 Java21 和 SpringBoot3 开发,后端使用 Spring Security 、 JWT 、 Spr

    2024年01月23日
    浏览(64)
  • 区块链与数字身份:Web3的身份验证革命

    随着数字化时代的发展,个人身份认证在日常生活和商业活动中变得越来越重要。然而,传统的身份认证方式存在着许多问题,如安全性不足、数据泄露、信息篡改等。而区块链技术的出现为数字身份认证带来了全新的解决方案。本文将深入探讨区块链与数字身份的关系,以

    2024年04月16日
    浏览(34)
  • Django身份验证初试

    使用Django身份验证框架在项目中构建一个身份验证系统。 Django有一个内置的认证框架,可以处理用户认证、会话、权限和用户组。 认证系统包括登录、注销、修改密码、重置密码等常见用户操作的视图。 当你使用startproject命令创建一个新的Django项目时,这个认证框架会包含

    2024年02月02日
    浏览(37)
  • Kingbase安全之身份验证

    身份验证是指验证连接到数据库的用户或其他实体的身份。 关于身份验证 口令保护和管理 用户的数据库身份验证 用户的网络身份验证 用户的客户端认证 3.2.1. 关于身份验证 ¶ 身份验证指的是当用户、设备或其他实体连接数据库,需要验证他们的身份。验证标识可为进一步

    2024年02月02日
    浏览(45)
  • 基于java+spingboot+vue的社区车位租赁系统微信小程序

    互联网发展至今,无论是其理论还是技术都已经成熟,而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播,搭配信息管理工具可以很好地为人们提供服务。针对高校教师成果信息管理混乱,出错率高,信息安全性差,劳动强度大,费时费力等问题,采用基于

    2024年01月17日
    浏览(48)
  • npm 配置双因素身份验证

    目录 1、关于双因素身份验证 2、NPM上的双因素身份验证 2.1 授权和写入 2.2 仅限授权 3、先决条件 4、从网站配置2FA 4.1 启用2FA 4.2 为写入禁用2FA 4.3 禁用2FA 5、从命令行配置2FA 5.1 从命令行启用2FA 5.2 从命令行发送一次性密码 5.3 从命令行删除2FA 6、配置帐户恢复选项 今天收到一

    2024年02月07日
    浏览(39)
  • github身份验证解决方案

    今天往github推送代码出现无法访问仓库的问题,账号密码也无法使用,弄了好久才解决,想着写一篇博客总结一下。 一般出现OpenSSL的字码说明这是一个https加密协议,https在没有身份验证(登录)的情况下,是无法进行git操作的。 出现这个报错的原因是前面与仓库建立连接时

    2024年02月11日
    浏览(39)
  • GitHub SSH 身份验证原理

    HTTPS和SSH是两种不同的协议,用于连接到远程Git仓库。它们的主要区别在于身份验证方式和连接方式: HTTPS:使用用户名和密码或者个人访问令牌(Personal Access Token)进行身份验证。每次推送或拉取代码时,都需要输入密码或令牌(除非你配置了密码缓存)。HTTPS通常在所有系

    2024年01月23日
    浏览(38)
  • .netcore grpc身份验证和授权

    权限认证这里使用IdentityServer4配合JWT进行认证 通过AddAuthentication和AddAuthorization方法进行鉴权授权注入;通过UseAuthentication和UseAuthorization启用鉴权授权 增加授权策略处理 使用密码模式,及简易内存处理 生成token带入grpc的metadata进行传递 服务端对应的方法标记特性[Authorize]进行

    2024年02月12日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包