使用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

200SMART PLC时间不准?手把手教你用MCGS触摸屏实现自动校时(附完整代码)

本文针对西门子200SMART PLC时钟不准的常见问题,提供了一套基于MCGS触摸屏的自动校时解决方案。文章详细阐述了时钟偏差的根源、时间同步方案的技术选型,并手把手指导如何配置MCGS与PLC的通信,以及编写完整的PLC时间读取、转换与设置代码,最终实现稳定可靠的自动时间同步功能。

jupyter5notebook的博客 452

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

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

小白轩的博客 4551

Pixhawk变砖自救指南:从DFU模式到固件重刷全流程(附2.4.8实测)

本文详细介绍了Pixhawk飞控变砖后的自救方法,从DFU模式进入、固件重刷到高级恢复技巧全流程。特别针对国产版本boot0引脚未引出的特殊情况提供了解决方案,帮助用户通过QGC或Mission Planner地面站工具恢复飞控功能,适用于2.4.8等常见固件版本。

weixin_29168813的博客 336

PyTorch实战:3D U-Net医学图像分割从零搭建(附完整代码)

本文详细介绍了如何使用PyTorch从零搭建3D U-Net模型进行医学图像分割,涵盖三维卷积实现、模块化架构设计、医学图像专属优化策略及完整训练流程。通过实战代码演示,帮助开发者掌握UNet-3D在CT、MRI等三维医学图像分割中的应用,提升肝脏肿瘤分割、肺结节检测等任务的准确性。

weixin_29061997的博客 328

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

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

scorpio的博客 2万+

番茄(西红柿)叶片病害检测数据集:12k+图像,10类,yolo标注

本文介绍了包含12,250张图像的番茄叶片病害检测数据集,涵盖10种常见病害类型及健康叶片,采用YOLO格式标注。数据集具有三大核心价值:科研层面填补病害样本空白,推动算法创新;产业应用支持精准诊断、早期预警,降低损失20-40%;社会生态方面减少农药使用15-30%,助力绿色农业。该数据集作为AI与农业结合的数字基础设施,适用于计算机视觉项目、科研实验等场景。

m0_73878864的博客 1130

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

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

陈三千的博客 2362

AIDC智算中心建设:资源池化核心技术解析

AI 应用的POD在运行的时候,通过池化运行时访问虚拟GPU、执行AI任务,池化运行时拦截对虚拟GPU的访问请求、转递给池化服务代理执行,池化服务代理通过向智算池化控制器查询虚拟GPU所对应的真实智算资源位置、规格,按查询结果分配智算资源、执行AI任务,如果真实的智算资源位于远程计算节点,则由本地池化服务代理将访问请求转递给远程计算节点上的池化服务代理处理,相关通信经由参数面网络。

u013891230的博客 2428

ABAP Module Pool 编程入门:把 Table Control 用透,在 Dynpro 里做出可编辑的列表界面

摘要:Table Control是SAP GUI中用于对话式事务的多行数据交互控件,具备滚动、选择、修改等功能。它通过CXTAB_CONTROL/CXTAB_COLUMN结构实现动态控制,需在PBO/PAI中配合LOOP循环处理数据流。开发时需注意LINES、TOP_LINE等关键字段设置,并采用并行循环简化编码。典型应用包括订单行维护、主数据管理等场景,支持多选删除、列排序等业务需求。(150字)

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 337

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

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

weixin_39518080的博客 1414

Open3D——平面点云凸多边形轮廓提取【2025最新版】

平面点云凸多边形轮廓提起,博客长期更新,本文最近更新时间为:2025年1月6日。

点云侠的博客 6752

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

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

qq_22593423的博客 1109

android 蓝牙通讯demo

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

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

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

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

weixin_56227932的博客 1万+

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

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

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

zhouzhiwengang的专栏 1万+

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

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、付费专栏及课程。

余额充值