springboot 点滴(3)springboot ThreadLocal实现单机权限认证

news2025/7/19 21:00:59

Springboot中权限认证的基本方案:
可以对URL进行HandlerInterceptor拦截,然后权限验证。

Client登录成功后,每次发送请求时,会将token等信息存放到header中。
Server收到请求,在HandlerInterceptor中从header获取用户的信息(userId,token等),然后存入上下文context;在后面Controller中就可以从上下文context中获取用户的信息做权限认证。

  • 单机应用上下文context:
    Threadlocal,在进程内部,我们可以使用ThreadLocal传递应用上下文的方式.。

  • 分布式系统上下文context:
    需要借助以下方式实现:
    1)数据库; 2)Redis ;3)文件系统。

1 HandlerInterceptor 拦截ThreadLocal实现上下文

这里讲一下单机应用Threadlocal。
ThreadLocal不是线程,是线程变量;.ThreadLocal 是 Java中一种较为特殊的线程绑定机制.通过ThreadLocal存取的数据,总是与当前线程相关。

第1步:创建User对象:

public class User {
    public String userId;
    public String orgId;
    public String token;
}

第2步:创建ThreadLocal对象来存取User:

public class ContextManager {
    private static final ThreadLocal<User>  threadLocal=  new ThreadLocal();

    public static User getUser() {
        return threadLocal.get();
    }

    public static void addUser(User user){
        threadLocal.set(user);
    }

    public static void removeUser(){
        threadLocal.remove();
    }

    public static String  getUserId(){
        return threadLocal.get().userId;
    }

    public static String  getToken(){
        return threadLocal.get().token;
    }
}

第3步:创建HandlerInterceptor:

public class AuthInterceptor implements HandlerInterceptor {
    @Autowired
    private HttpRequest httpRequest;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("threadId:"+Thread.currentThread().getId());
        String userId = (String)request.getHeader("userId");
        String token = (String)request.getHeader("token");
        if(!StringUtils.hasLength(userId)){
            response.getWriter().println("please login");
            return false;
        }
        if(!StringUtils.hasLength(token)){
            response.getWriter().println("please login");
            return false;
        }
        //将用户相关的信息存入threadlocal中
        User user = new User();
        user.userId = userId;
        user.token = token;
        ContextManager.addUser(user);
        return true;
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("afterCompletion:"+Thread.currentThread().getId());
        ContextManager.removeUser();
    }
}

第4步:创建WebMvcConfigurer:
Spring Boot 1.5版本:重写WebMvcConfigurerAdapter的方法来添加自定义拦截器。
SpringBoot 2.0 版本后,该类被标记为@Deprecated(弃用)。官方推荐直接实现WebMvcConfigurer或者直接继承WebMvcConfigurationSupport,
1)实现WebMvcConfigurer接口(推荐),
2)继承WebMvcConfigurationSupport类

@Configuration
public class LWebMvcConfigurer implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        ArrayList<String> whiteList = new ArrayList<>();
        whiteList.add("/login");
        whiteList.add("/logout");
        registry.addInterceptor(new AuthInterceptor())
                .excludePathPatterns(whiteList)
                .addPathPatterns("/**");
    }
}

第5步:创建HelloController 来验证从threadlocal中获取数据:

@RestController
public class HelloController {

    @RequestMapping(value = "/hello", method = RequestMethod.GET)
    public String hello() {
        String token = ContextManager.getToken();
        if(!StringUtils.hasLength(token)){
            return "please login!";
        }
        log.info("token:"+ token);
        String userId = ContextManager.getUserId();
        if(!StringUtils.hasLength(userId)){
            return "please login!";
        }
        log.info("userId:"+ userId);
        return  "hello world!";
    }
}

2 测试验证

2.1 请求有token

在这里插入图片描述
controller中获取token:在这里插入图片描述

2.2 请求没有token

在这里插入图片描述
需要用户的请求header中增加token。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

3.4、可靠传输

3.4、可靠传输 3.4.1、基本概念 使用差错检测技术\color{red}差错检测技术差错检测技术&#xff08;例如循环冗余校验 CRC )&#xff0c;接收方的数据链路层就可检测出帧在传输过程中是否产生了误码\color{red}误码误码&#xff08;比特错误)。 数据链路层向上层提供的服务类…

hive中连续N天登录问题、topN问题、拉链表实现

一、连续N天登录问题 一般采用开窗函数来实现 首先需要用到窗口函数的向下取值 窗口函数lead 功能&#xff1a;用于从当前数据中基于当前行的数据向后偏移取值 语法&#xff1a;lead(colName&#xff0c;N&#xff0c;defautValue) colName&#xff1a;取哪一列的值 N&#xf…

RemObjects Remoting SDK for Delphi

RemObjects Remoting SDK for Delphi 远程处理SDK是一个框架&#xff0c;允许您创建使用服务公开性能的服务器。然后&#xff0c;可以通过网络远程访问这些解决方案&#xff0c;这些解决方案可以通过运行在大量语言和平台上的客户端软件来实现。 在当今时代&#xff0c;许多程序…

【人才盘点九宫格】你还不来学一学人才九宫格,知道你在领导心目中是属于哪一类人才吗?

文章目录一、九宫格的维度——绩效、能力、潜力1.1 维度一&#xff1a;绩效。1.2 维度二&#xff1a;能力。1.3 维度三&#xff1a;潜力。二、九宫格分类2.1 经典九宫格&#xff1a;绩效-能力九宫格2.2 高潜九宫格&#xff1a;绩效-潜力九宫格2.2.1 高潜九宫格图示2.2.2 高潜九…

SRV1:拥有一个阿里云服务器

1.1 简介 平台&#xff1a; 阿里云   时间&#xff1a; 2022.11.25   类型&#xff1a; 轻量应用服务器2核2G   链接&#xff1a; https://www.aliyun.com/daily-act/ecs/activity_selection?utm_contentse_1013075595 1.2 说明 本文购买的是阿里云的 轻量应用服务器2…

NFT 的洗盘交易,真的赚钱吗?

Nov. 17&#xff0c;Hanson Data Source&#xff1a; Footprint Analytics Wash Trade Analysis 洗盘交易造成的虚假交易是准确评估 NFT 项目、交易所和整个行业的最大障碍之一。 这份报告将会分析X2Y2市场的洗盘交易者如何从洗盘交易和代币质押中获励。同时分析了前10交易量…

3.3、差错检测

3.3、差错检测 3.3.1、比特差错 比特差错\color{red}比特差错比特差错 实际的通信链路都不是理想的&#xff0c;比特在传输过程中可能会产生差错: 111 可能会变成 000 ,而 000 也可能变成 111 。 比特流在传输过程中由于受到各种干扰&#xff0c;就可能会出现比特差错&#…

K8S基础知识学习

目录 一、什么是 Kubernetes &#xff1f; Kubernetes是Google在2014年开源的一个容器集群管理系统&#xff0c;Kubernetes简称K8S。 K8S用于容器化应用程序的部署&#xff0c;扩展和管理。 K8S提供了容器编排&#xff0c;资源调度&#xff0c;弹性伸缩&#xff0c;部署管理&a…

详解设计模式:简单工厂模式

简单工厂模式&#xff08;Smiple Factory Pattern&#xff09;&#xff1a;定义一个工厂类&#xff0c;他可以根据参数的不同返回不同类的实例&#xff0c;被创建的实例通常都具有共同的父类&#xff0c;简单工厂模式也被称为静态工厂模式。 &#xff5e; 本篇内容包括&#xf…

若依(Ruoyi-Vue-Plus版)——1.登录(SaToken)

这里学习一下若依框架的一个扩展版本&#xff1a; RuoYi-Vue-Plus: 后台管理系统 重写RuoYi-Vue所有功能 集成 Sa-TokenMybatis-PlusJacksonXxl-JobSpringDocHutoolOSS 定期同步 (gitee.com) 官方文档&#xff1a;文档预览 - Gitee.com 项目有关SaToken登录写在最后&#xff0c…

论文阅读笔记 | 三维目标检测——SECOND算法

如有错误&#xff0c;恳请指出。 文章目录1. 背景2 网络结构2.1 3d Backbone2.2 Loss Compute2.3 Data Augment3. 实验结果paper&#xff1a;《SECOND: Sparsely Embedded Convolutional Detection》 1. 背景 鉴于VoxelNet等3d检测算法中使用的3d卷积会导致计算量大且推理速度…

智慧税务解决方案-最新全套文件

智慧税务解决方案-最新全套文件一、建设背景税务大数据现状和挑战1、数据割裂&#xff0c;外部数据整合不足&#xff0c;智能化应用不足2、缺乏统一治理&#xff0c;数据资产不清&#xff0c;质量不高3、数据获取效率低&#xff0c;数据冗余、查询效率低4、 运营运维体系不健全…

【Linux】---进程地址空间

文章目录什么是进程地址写时拷贝为什么要有进程地址为了保护物理内存更方便进行进程和进程数据的解耦统一视角操作系统怎么管理进程地址区域划分在之前学习C/C的时候都会提到 地址这个概念&#xff0c;我们写代码时创建变量&#xff0c;定义函数等都会有其对应的地址空间。而地…

成为数字游民,他们为何「All in Web3」?

成为数字游民&#xff0c;他们为何「All in Web3」&#xff1f; “早上好&#xff0c;夜之城。” 赛博朋克承载着一代人对未来世界的遐想。今年上映的「赛博朋克&#xff1a;边缘行者」中&#xff0c;主人公大卫面临着不夜城旧有制度的高压和控制&#xff0c;对旧有秩序不断发…

C++STL-string类的实现(下)

文章目录1. 流插入和流提取1.1 流插入1.2 流提取2. 现代写法的拷贝构造和赋值函数2.1 现代写法的拷贝构造2.1 现代写法的赋值函数3. string类的迭代器实现3.1 正向迭代器1. 流插入和流提取 1.1 流插入 可能有的同学会这样去写&#xff1a;以一个字符串形式来输出。还有的人会这…

《CTFshow - Web入门》03. Web 21~30

Web 21~30web21知识点题解web22知识点题解web23知识点题解web24知识点题解web25知识点题解web26知识点题解web27知识点题解web28知识点题解web29知识点题解web30知识点题解web21 知识点 tomcat 认证爆破burpsuite暴力破解&#xff08;Sniper&#xff09;之custom iterator使用…

用Numba:一行代码将Python程序运行速度提升100倍

用Numba&#xff1a;一行代码将Python程序运行速度提升100倍 在《用PyPy加速Python程序》中我们看到&#xff0c;PyPy通过JIT技术可以将Python的运行速度平均提高3-4倍。但即便是提升后&#xff0c;Python的执行速度依然无法与C/C/Rust同日而语。并且PyPy对Python程序的优化对…

【计算机毕业设计】33.快递取件预约系统源码

一、系统截图&#xff08;需要演示视频可以私聊 摘 要 本论文主要论述了如何使用JSP技术开发一个快递取件预约系统&#xff0c;本系统将严格按照软件开发流程进行各个阶段的工作&#xff0c;采用B/S架构&#xff0c;面向对象编程思想进行项目开发。在引言中&#xff0c;作者将论…

GEO振弦式钢筋计适用范围

适用范围 钢筋计&#xff1a;用于监测岩土工程混凝土建筑物的应力&#xff0c;适用于长期埋设在水工建筑物或其他建 筑物内部&#xff0c;测量结构物内部的钢筋应力。 锚杆应力计&#xff1a;钢筋计用于测量锚杆应力时&#xff0c;成为锚杆应力计。装上锚杆应力计的锚杆称…

Flink部署之Yarn

Flink部署之Yarn 一、环境准备 1、Flink 是一个分布式的流处理框架&#xff0c;所以实际应用一般都需要搭建集群环境。 需要准备 3 台 Linux 机器。具体要求如下&#xff1a; 系统环境为 CentOS 7.5 版本。安装 Java 8。安装 Hadoop 集群&#xff0c;Hadoop 建议选择 Hadoop…