使用springboot和redis实现redis权限认证

SpringBoot整合JWT+Spring Security+Redis实现登录拦截(二)权限认证 可直接使用已有的权限检测@PreAuthorize(“hasAuthority('自定义字符串')”),hasAuthority是系统提供的,可直接使用,也可以自定义。以下为自定义,为方便直接判断admin用户,并给admin用户授予所有权限。/*** 自定义权限检测*/// 获取当前用户的所有权限// 判断当前用户的所有权限是否包含接口上定义的权限。 阅读详情

一、引言

登录权限控制是很多系统具备的功能,实现这一功能的方式有很多,其中使用token是现在用的比较多的

好处:可以防止CSRF攻击

二、功能实现:

用户登录成功后,后台生成一个token并存在redis中,同时给此用户的token设置时限,返回一个token给调用者,同时自定义一个@AuthToken注解,被该注解标注的API请求都需要进行token效验,效验通过才可以正常访问,实现接口级的鉴权控制。同时token具有生命周期,在用户持续一段时间不进行操作的话,token则会过期,用户一直操作的话,则不会过期。

具体流程:

1、 用户输入账号密码,发送请求给后台,后台生成一个token,将用户的用户名或者手机号等跟token绑定存入redis中,并且设置过期时间,同时将当前时间戳也存入redis中


    @PostMapping(value = "login")
    public ResponseTemplate login(String phone, String password) {

        User user = userService.getUser(phone,password);

        JSONObject result = new JSONObject();

        if (user != null) {
            Jedis jedis = new Jedis("localhost", 6379);
            String token = tokenGenerator.generate(phone, password);
            //设置token以及过期时间
            jedis.set(token, phone);
            //设置key生存时间,当key过期时,它会被自动删除,时间是秒
            jedis.expire(token, ConstantKit.TOKEN_EXPIRE_TIME);
            //记录设置token的时间,以便于后续调用时分析token是否过期
            Long currentTime = System.currentTimeMillis();
            jedis.set(token + phone, currentTime.toString());
            jedis.expire(token+phone,ConstantKit.TOKEN_EXPIRE_TIME);
            //用完关闭
            jedis.close();
            result.put("token", token);
            result.put("status",1);
        } else {
            result.put("status",0);
        }
        return ResponseTemplate.builder()
                .code(200)
                .message("OK")
                .data(result)
                .build();

2、每次请求接口都会走拦截器,如果该接口标注了@AuthToken注解,则要检查客户端传过来的Authorization字段,获取 token。并且根据token是否存在redis中,如果可以获取则说明 token 正确,反之,说明错误,返回鉴权失败。

3、token可以根据用户使用的情况来动态的调整自己过期时间。在生成 token 的同时也往 redis 里面存入了创建 token 时的时间戳,每次请求被拦截器拦截 token 验证成功之后,将当前时间与存在 redis 里面的 token 生成时刻的时间戳进行比较,当当前时间的距离创建时间快要到达设置的redis过期时间的话,就重新设置token过期时间,将过期时间延长。如果用户在设置的 redis 过期时间的时间长度内没有进行任何操作(没有发请求),则token会在redis中过期。

public class AuthorizationInterceptor implements HandlerInterceptor {

    //存放鉴权信息的Header名称,默认是Authorization
    private String httpHeaderName = "Authorization";

    //鉴权失败后返回的错误信息,默认为401 unauthorized
    private String unauthorizedErrorMessage = "401 unauthorized";

    //鉴权失败后返回的HTTP错误码,默认为401
    private int unauthorizedErrorCode = HttpServletResponse.SC_UNAUTHORIZED;

    /**
     * 存放登录用户模型Key的Request Key
     */
    public static final String REQUEST_CURRENT_KEY = "REQUEST_CURRENT_KEY";

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        if (!(handler instanceof HandlerMethod)) {
            return true;
        }
        HandlerMethod handlerMethod = (HandlerMethod) handler;
        Method method = handlerMethod.getMethod();

        // 如果打上了AuthToken注解则需要验证token
        if (method.getAnnotation(AuthToken.class) != null || handlerMethod.getBeanType().getAnnotation(AuthToken.class) != null) {

            //从请求体中取出token
            //String token = request.getParameter(httpHeaderName);
            //从请求头中取出token
            String token = request.getHeader(httpHeaderName);

            log.info("Get token from request is {} ", token);
            String phone = "";
            Jedis jedis = new Jedis("localhost", 6379);
            if (token != null && token.length() != 0) {
                phone = jedis.get(token);
                log.info("Get username from Redis is {}", phone);
            }
            if (phone != null && !phone.trim().equals("")) {
                Long tokeBirthTime = Long.valueOf(jedis.get(token + phone));
                log.info("token Birth time is: {}", tokeBirthTime);
                Long diff = System.currentTimeMillis() - tokeBirthTime;
                log.info("token is exist : {} ms", diff);
                //重新设置Redis中的token过期时间
                if (diff > ConstantKit.TOKEN_RESET_TIME) {
                    jedis.expire(token, ConstantKit.TOKEN_EXPIRE_TIME);
                    log.info("Reset expire time success!");
                    Long newBirthTime = System.currentTimeMillis();
                    jedis.set(token + phone, newBirthTime.toString());
                    jedis.expire(token + phone,ConstantKit.TOKEN_EXPIRE_TIME);
                }

                //用完关闭
                jedis.close();
                request.setAttribute(REQUEST_CURRENT_KEY, phone);
                return true;
            } else {
                JSONObject jsonObject = new JSONObject();

                PrintWriter out = null;
                try {
                    response.setStatus(unauthorizedErrorCode);
                    response.setContentType(MediaType.APPLICATION_JSON_VALUE);

                    jsonObject.put("code", ((HttpServletResponse) response).getStatus());
                    jsonObject.put("message", HttpStatus.UNAUTHORIZED);
                    out = response.getWriter();
                    out.println(jsonObject);

                    return false;
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    if (null != out) {
                        out.flush();
                        out.close();
                    }
                }

            }
        }
        request.setAttribute(REQUEST_CURRENT_KEY, null);
        return true;
    }
}

登录成功

当没有权限时调用接口

 

代码demo: github地址

 

 

Spring Boot 3.1.4 与 Redis 集成错误:ERR AUTH <password> 问题的解析与解决 当在Spring Boot 3.1.4应用程序中集成Redis时,可能会遇到错误消息 'ERR AUTH called without any password configured for the default user'。这篇文章将深入分析这个问题,解释为什么它会发生,以及如何解决它。我们将探讨密码配置、Redis服务器设置和连接问题,以及提供最佳实践建议,以确保您的Spring Boot应用程序与Redis服务器正确通信。 阅读详情

相关推荐

Spring Boot 中 Redis 的用法详解

Redis 是一个高性能的键值存储系统,它支持丰富的数据结构,如字符串、哈希、列表、集合、有序集合等。缓存:减少数据库查询压力,加速数据读取。消息队列:使用 Redis 实现发布订阅和消息队列。会话存储:在分布式系统中,使用 Redis 存储用户会话信息。实时数据分析:Redis 提供了高效的操作,可以用于实时分析和处理数据。本文详细介绍了如何在 Spring Boot 中集成和使用 Redis。

wjianwei666的专栏 369

springboot 集成Redis

介绍两种方法,亲测有效: 一、利用spring-boot-starter-data-redis   1.导包     <!-- redis 依赖 -->         <dependency>         <groupId>org.springframework.boot</groupId>         <artifactId&...

qq_42317294的博客 414

别再死记硬背了!用Python+Matlab/Simulink手把手带你理解PID控制器的‘稳、快、准’

本文通过Python编程和Matlab/Simulink仿真,深入解析PID控制器的‘稳、快、准’三大核心指标,帮助读者直观理解PID控制的实现原理与参数整定技巧。内容涵盖经典控制理论和自动控制原理,提供实战案例和高级调参技巧,适合工业自动化领域的学习者和工程师。

weixin_42551227的博客 367

Springboot+Redis实现登录Authorization权限验证

1、引言 登录权限控制是很多系统具备的功能,实现这一功能的方式有很多,其中使用token是现在用的比较多的 好处:可以防止CSRF攻击 2、功能实现思路以及导入 pom.xml 相关依赖 用户登录成功后,后台生成一个token秘钥值并存在redis中,同时给此用户的token设置时限,返回一个token给调用者,同时自定义一个@AuthToken注解,被该注解标注的API请求都需要进行token效...

小白轩的博客 4551

从翼型到湍流:用生活化案例图解空气动力学核心概念(中英双语版)

本文通过飞机机翼、F1赛车、高尔夫球等生活化案例,图解空气动力学核心概念。深入浅出地解释了攻角如何产生升力、边界层与流动分离如何影响阻力、马赫数如何划分速度世界,以及涡流与湍流的特性与应用。文章还介绍了计算流体动力学(CFD)这一现代数字风洞工具,帮助读者直观理解这些塑造现代交通与运动设计的无形之力。

metaverse5vr的博客 475

Pytest 常见问题及其解决方案

Pytest 是一个强大且灵活的测试框架,但初学者在使用过程中难免会遇到各种问题。希望通过这篇文章,你能更好地应对常见的挑战,写出更高效、更稳定的测试代码。测试不是负担,而是保障。写好测试不仅能提高代码质量,还能让你在面对变更时更加从容自信。

qq_52137592的博客 899

基于SpringBoot和Redis实现Token权限认证

一、引言 用户登录成功后后台会返回一个token给调用者,同时我们自定义了@AuthToken注解,被该注解标注的api进行请求的时候都需要进行token效验, 效验通过才可以正常访问,实现接口级的鉴权控制。同时token具有生命周期,在用户持续一段时间不进行操作的话,token则会过期,用户一直操作的话,则不会过期。 二、环境 三、流程分析 四、具体代码实现 五、小结 流程分析 客户端登录,输入...

scorpio的博客 2万+

【嵌入式Linux驱动开发】二十四、Linux I2C 驱动上手尝试

  人的前程关于眼界、关乎格局。   志之所趋,无远弗届,穷山复海不能限也;   志之所向,无坚不入,锐兵精甲不能御也。 一、I2C驱动框架简介   Linux内核将 I2C 驱动分为两部分: ①、 I2C 总线驱动, I2C 总线驱动就是 SOC 的 I2C 控制器驱动,也叫做 I2C 适配器驱动。 ②、 I2C 设备驱动, I2C 设备驱动就是针对具体的 I2C 设备而编写的驱动。 1....

悟已往之不谏 知来者之可追 1068

基于SpringBoot和Redis实现Token权限认证 & 基于redis实现token验证用户是否登陆

1 一、引言 登陆权限控制是每个系统都应必备的功能,实现方法也有好多种。下面使用Token认证来实现系统的权限访问。 功能描述: 用户登录成功后,后台返回一个token给调用者,同时自定义一个@AuthToken注解,被该注解标注的API请求都需要进行token效验,效验通过才可以正常访问,实现接口级的鉴权控制。同时token具有生命周期,在用户持续一段时间不进行操作的话,token则会过期,用户一直操作的话,则不会过期。 二、环境 SpringBoot、Redis(Docke中镜像)、MySQL(Doc

陈三千的博客 2362

APP爬虫:Airtest的使用和爬取实战详解

Airtest是一个跨平台的自动化测试工具,主要用于移动应用和游戏的UI自动化测试。它支持图像识别、触摸操作、文本输入等功能,能够模拟真实用户的操作行为。此外,Airtest还具备强大的日志记录和报告生成功能,方便开发者进行调试和分析。图像识别:通过截图匹配元素,无需依赖 UI 层次结构。跨平台支持:支持 Android、iOS 和 Windows 应用。简单易用:提供 IDE 和脚本录制功能,降低使用门槛。

数据知道的博客 9618

WordPress插件depicter存在SQL注入漏洞(CVE-2025-2011)

Depicter 是一款功能强大的 WordPress 幻灯片插件,允许用户通过直观的拖放编辑器轻松创建响应式滑块、轮播和动态内容展示。该插件提供丰富的模板库、动画效果和图层控制,支持多媒体内容嵌入(如图片、视频、HTML),并优化了移动端显示和SEO性能。其无代码操作界面适合非技术用户,同时提供高级自定义选项,适用于产品展示、营销推广和视觉叙事等多种场景,是提升网站视觉吸引力的高效工具。

m0_50125527的博客 550

Spring boot整合Shiro+Redis实现登录认证、权限管理以及分布式环境下的会话共享

shiroshiro简介新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 shiro简介 什么是shiro? 新...

weixin_39518080的博客 1414

Arduino与Proteus仿真实例-LCD2004-I2C(PCF8574)驱动仿真

LCD2004-I2C(PCF8574)驱动仿真 PCF8574/74A 通过两线双向 I2C 总线(串行时钟 (SCL)、串行数据 (SDA))提供通用远程 I/O 扩展。 LCD2004,即2004字符型液晶显示器,是一种点阵模块,用于显示字母、数字、字符等。 它由 5x8 个点阵位置组成; 每个位置可以显示一个字符。 两个字符之间有一个点间距,行之间有一个空格,从而将字符和行分开。 模型 2004 表示它显示 4 行,每行 20 个字符。 在前面的实例中对PCF8574和LCD2004的已经做了详细介

视觉与物联智能 1165

Spring Boot + Vue的网上商城之springsecurity+jwt+redis实现用户权限认证实现

本文介绍了如何使用Spring Security和Vue实现用户登录和权限认证的功能。通过使用JWT和Redis存储Token,我们可以实现无状态的用户认证,提高系统的可扩展性和安全性。同时,通过使用Vue的路由导航守卫,我们可以实现前端的权限校验,确保只有登录用户才能访问受限资源。希望本文能对你理解和实现用户登录和权限认证功能有所帮助。

qq_22593423的博客 1109

DataCastle-租金预测

ID:编号;时间:房屋信息采集的时间;小区名:房屋所在小区,已脱敏处理;小区房屋出租数量:小区出租房屋数量,已脱敏处理;楼层:0、1、2分别表示楼层低,中,高;总层数:房屋所在建筑的总楼层数,已脱敏处理;房屋面积:房屋面积数值,已脱敏处理;房屋朝向:房屋的朝向;居住状态:房屋的居住状态,表示是否已出租或居住中,已脱敏处理;卧室数量:户型信息,数字表示卧室的个数;卫的数量:户型信息,数字表示卫生间的个数;厅的数量:户型信息,数字表示厅的个数;

优快云 精品推荐 3457

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

springboot整合shiro + jwt + redis实现权限认证(上手即用)

最近项目中涉及到使用shiro来作为权限认证,之前对shiro没有做太多的了解,所以一段时间不用的话,忘记得很快,好记性不如烂笔头。在闲暇之余整理springboot整合shiro得demo,我看了网上一些整合得案列,有写得好的,也有些残差不全。我结合目前使用得项目中代码,整合了一遍。基本上可以直接放在项目中使用。如果有什么缺陷,希望大家指正,目前博客只贴出主要的类供大家参考,具体的请移步gitee上看详细类容。

weixin_56227932的博客 1万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

SpringBoot + Apache Shrio + JWT +Redis 实现权限认证

什么是Apache shrio Apache Shiro 是一个强大灵活的开源安全框架,可以完全处理身份验证、授权、加密和会话管理。 Realm是Shiro的核心组建,也一样是两步走,认证和授权,在Realm中的表现为以下两个方法。 认证:doGetAuthenticationInfo,核心作用判断登录信息是否正确 授权:doGetAuthorizationInfo,核心作用是获取用户的权限字符串,用于后续的判断 Apache Shrio 过滤器 当 Shiro 被运用到 web 项目时,Shir

zhouzhiwengang的专栏 1万+

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

SpringBoot + Redis实现token权限认证(附源码)

一、引言 登陆权限控制是每个系统都应必备的功能,实现方法也有好多种。下面使用Token认证来实现系统的权限访问。 功能描述: 用户登录成功后,后台返回一个token给调用者,同时自定义一个@AuthToken注解,被该注解标注的API请求都需要进行token效验,效验通过才可以正常访问,实现接口级的鉴权控制。同时token具有生命周期,在用户持续一段时间不进行操作的话,token则会过期,用户一直操作的话,则不会过期。 二、环境 SpringBoot Redis(Docke中镜像

u012102536的博客 1932

Sa-Token实现分布式登录鉴权(Redis集成 前后端分离)

Sa-Token 是一个轻量级 Java 权限认证框架,主要解决:登录认证、权限认证、单点登录、OAuth2.0、分布式Session会话、微服务网关鉴权 等一系列权限相关问题。

Lifelong learning 1万+

Springboot-shiro-redis实现登录认证和权限管理

Springboot-shiro-redis实现登录认证和权限管理   在学习之前:   首先进行一下Apache Shiro和Shiro比较:   Apache Shiro是一个功能强大、灵活的,开源的安全框架。它可以干净利落地处理身份验证、授权、企业会话管理和加密。Apache Shiro的首要目标是易于使用和理解。安全通常很复杂,甚至让人感到很痛苦。   但是Shiro却不是这...

weixin_34198762的博客 1019

springboot的图书管理系统设计实现

Spring Boot图书管理系统的技术栈通常包含后端框架、前端技术、数据库、安全认证等模块。

java python定制开发 643

优雅的实现SpringBoot动态权限校验,可以这样做!

关注公众号:woniuxgg,在公众号中回复:笔记 就可以获得蜗牛为你精心准备的java实战语雀笔记,回复面试、开发手册、有超赞的粉丝福利!

1481
上一篇: Spring boot 和 Vue 前后端分离项目的启动部署(详细版)
下一篇: 数据库优化总结
SOFT-WORKER
博客等级 码龄9年 440粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值