首页 > 数据库 >Token+Redis登录认证

Token+Redis登录认证

时间:2022-10-28 21:14:30浏览次数:47  
标签:return 有效期 登录 Redis token 认证 Token

首先需要了解一下大概的步骤

  1. 登录生成一个Token存入Redis有效期为30分钟,返回到前端
  2. 之后前端每次请求,带上登录时返回的Token
  3. 服务器判断前端带来的Token是否在Redis服务器中
  4. 存在放行并且重置Token有效期,不存在拦截

一个简简单单的登录请求

@RequestMapping("/login")
@ResponseBody
public Result<String> login(@RequestBody UserDTO userDTO) {
    var byUsernameAndPassword = mapper.getByUsernameAndPassword(userDTO.getUsername(), userDTO.getPassword());
    if (byUsernameAndPassword != null) {
        return new Result<>(true, "login success");
    }
    return new Result<>(false, "wrong username or password");
}

生成一个UUID存入Redis,值为用户的ID,并且设置有效期为30分钟

var uuid = "user-token:" + UUID.randomUUID();
            redisTemplate.opsForValue().set(uuid, byUsernameAndPassword.getId().toString(), 30, TimeUnit.MINUTES);
            return new Result<>(true, uuid);

接下来直写拦截器,重写addInterceptors方法

@Configuration
public class RequestInterceptor implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {

    }
}

使用HandlerInterceptor重写preHandle方法,登录和注册不用拦截

registry.addInterceptor(new HandlerInterceptor() {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        return false;
    }
}).excludePathPatterns("/user/login", "/user/register");

前端在请求头中放入Token,之后从请求头中获取Token,从Redis中获取token是否存在,存在返回为true并且重新设置有效期,不存在就返回false设置响应状态为401

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    var token = request.getHeader("token");
    if (token != null && redisTemplate.opsForValue().get(token) != null) {
        redisTemplate.expire(token, 30, TimeUnit.MINUTES);
        return true;
    }
    response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
    return false;
}

到这里一个简简单单的Token登录认证就完成了,不过还有个小问题,那就是只有访问需要拦截的地址时,有效期才会被重置,用户一直访问不需要拦截的地址,Token有效期那就不会被重置,所以解决方法也很简单,那就是在登录认证的拦截器之前再加一个拦截器,用来刷新Token有效期

标签:return,有效期,登录,Redis,token,认证,Token
From: https://www.cnblogs.com/little-monster-lhq/p/16837491.html

相关文章

  • redis常见问题(三)
    redis安装之后导致linux无法正常启动问题现象:在linux安装redis后,将redis设置为开机启动项,导致系统开机后停在redis启动界面,无法登陆系统,shell命令行也无法显示,如下图:问题原......
  • 11 月亚马逊云科技培训与认证课程,精彩不容错过!
    备考训练营:AmazonCertified云从业者2022年11月8日|10:00–11:30课程介绍:该课程无需您拥有特定的职业技能,您可以通过此课程获得对亚马逊云科技的全面了解,在该线上......
  • jwt+token,springsecurity认证方式总结
    基于redis的认证方式分析redis解决短信验证码时效性,以及使用token的方式判断是否登录的问题。(没用jwt)这里面使用两个拦截器的方式解决:1.给token有效期刷新2.判断用户......
  • accessToken获取方法
    百度的教程太笼统了一开始没看懂,解释一下accessToken获取方法他这个教程里,在这个例如里有一长串网址,把这个复制下来,然后把这个里面的client_id=后面的改成你百度智能云项......
  • 问题定位记录1:Djano-redis库报错No connection available
    一、问题现象MANO(网络管理与编排软件)原子层创建资源后写redis缓存时报错Noconnectionavaiable堆栈打印:Traceback(mostrecentcalllast): File"/home/oes/.loca......
  • Linux系统下如何设置开机自动运行脚本?以Redis开机自启为例
    参考链接:https://baijiahao.baidu.com/s?id=1722174560616569543&wfr=spider&for=pc前言:最近在安装Redis的时候,想找下Redis开机自启的功能,在网上找了很多的教程,貌似很多......
  • Token需要缓存到Redis的原因
    1、实现单点登录假设:有设备AB、无单点登录限制的某APP、一个账号(用户)设备A在APP第1次登录用户,服务器会给该用户创建1个Token并返回到设备A,设备A会将该Token保存到本地......
  • redis 持久化之RDB和AOF的区别
    持久化之RDB定义:在指定的时间间隔内生成数据集的时间点快照RDB的优点:1.RDB是一个非常紧凑的文件它保存了Redis在某个时间点上的数据集。这种文件非常适合用于进......
  • openstack出现 CRITICAL keystonemiddleware.auth_token或dashboard无法获取实例信息
    问题背景在清理空间的时候误删service项目,导致openstack环境无法使用dashboard登录账户,出现无法获取使用信息等错误在命令行查看各种服务,出现HTTP503[root@node06~]#......
  • 突然挂了!Redis缓存都在内存中,这下完了!
    我是Redis,一个叫Antirez的男人把我带到了这个世界上。“快醒醒!快醒醒!”,隐隐约约,我听到有人在叫我。慢慢睁开眼睛,原来旁边是MySQL大哥。“我怎么睡着了?”“嗨,你刚才......