首页 > 数据库 >基于Redis的Token认证机制

基于Redis的Token认证机制

时间:2024-11-05 22:15:08浏览次数:3  
标签:return String REDIS Redis token 认证 Token key public

Redis数据库设计

/**
* redis key 前缀
*/
public static final String REDIS_KEY_PREFIX = "easylive:";

/**
* 验证码key
*/
public static final String REDIS_KEY_CHECK_CODE = REDIS_KEY_PREFIX + "check_code:";

/**
* Redis key token web
*/
public static final String REDIS_KEY_TOKEN_WEB = REDIS_KEY_PREFIX + "token:web:";

public static final String TOKEN_WEB = "token";

public static final String TOKEN_ADMIN = "adminToken";

public static final String REDIS_KEY_TOKEN_ADMIN = REDIS_KEY_PREFIX + "token:admin:";

  • Redis 数据库存储如下:
    在这里插入图片描述

easylive:token:admin+token(UUID)

  • easylive:token:admin+token作为键,值 为 account账户

在这里插入图片描述

easylive:token:web+token(UUID)

  1. easylive:token:web+token作为键,值为 TokenUserInfoDto
{"@class":"com.easylive.entity.dto.TokenUserInfoDto",
 "userId":null,
 "nickName":null,
 "avatar":null,
 "expireAt":1730826856010,
 "token":"5b09d79f-b5c5-4a37-a4b4-3bba8fbad0ec",
 "fansCount":null,
 "currentCoinCount":null,
 "focusCount":null}
  1. TokenUserInfoDto实体
@JsonIgnoreProperties(ignoreUnknown = true)
public class TokenUserInfoDto implements Serializable {
    private static final long serialVersionUID = -6910208948981307451L;
    private String userId;
    private String nickName;
    private String avatar;
    private Long expireAt;
    private String token;
}

登录

  1. admin 端登录
@RequestMapping(value = "/login")
public ResponseVO login(HttpServletRequest request,
                        HttpServletResponse response,
                        @NotEmpty String account,
                        @NotEmpty String password, @NotEmpty String checkCode,
                        @NotEmpty String checkCodeKey) {
    try {
        if (!checkCode.equalsIgnoreCase((String) redisUtils.get(Constants.REDIS_KEY_CHECK_CODE + checkCodeKey))) {
            throw new BusinessException("图片验证码不正确");
        }
        if (!account.equals(appConfig.getAdminAccount()) || !password.equals(StringTools.encodeByMD5(appConfig.getAdminPassword()))) {
            throw new BusinessException("账号或者密码错误");
        }
        String token = redisComponent.saveTokenInfo4Admin(account);
        // 把token 放入cookie 中
        saveToken2Cookie(response, token);
        return getSuccessResponseVO(account);
    } finally {
        // 去掉老的admintoken
        redisUtils.delete(Constants.REDIS_KEY_CHECK_CODE + checkCodeKey);

        Cookie[] cookies = request.getCookies();
        String token = null;
        for (Cookie cookie : cookies) {
            if (cookie.getName().equals(Constants.TOKEN_ADMIN)) {
                token = cookie.getValue();
            }
        }
        if (!StringTools.isEmpty(token)) {
            redisComponent.cleanToken4Admin(token);
        }
    }
}

public String saveTokenInfo4Admin(String account) {
    String token = UUID.randomUUID().toString();
    redisUtils.setex(Constants.REDIS_KEY_TOKEN_ADMIN + token, account, Constants.REDIS_KEY_EXPIRES_DAY);
    return token;
}

public void saveToken2Cookie(HttpServletResponse response, String token) {
    Cookie cookie = new Cookie(Constants.TOKEN_ADMIN, token);
    cookie.setMaxAge(-1);
    cookie.setPath("/");
    response.addCookie(cookie);
}

总结

  1. 把用户信息存入 redis中,并返回对应的 token, 这个 token + 对应的前缀就是 redis 中对应的 键。后期可以通过这个键找到值。从而进行身份校验。
  2. 返回的 token 相当于是 用户信息的加密映射。存入 cookie

Cookie cookie = new Cookie(Constants.TOKEN_ADMIN, token); 草草画个图

标签:return,String,REDIS,Redis,token,认证,Token,key,public
From: https://blog.csdn.net/Ireviewstart666/article/details/143531512

相关文章

  • redis缓存常见问题及解决方案
    redis缓存常见问题及解决方案1、缓存穿透缓存穿透:是指查询一个不存在的数据,由于缓存无法命中,将去查询数据库,但是数据库也无此记录,并且出于容错考虑,我们没有将这次查询的null写入缓存,这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义。在流量大时,可能DB就......
  • MySql与Redis
    MySql与Redis1.Redis和MySQL如何保持数据一致性数据同步可以有延时一、延时双删策略在写库前后都进行redis.del(key)操作,并且设定合理的超时时间。publicvoidwrite(Stringkey,Objectdata){redis.delKey(key);//删除redis缓存db.updateData(data)......
  • 北京科技大学——数字认证作业答案合集(大部分)
    ......
  • SpringBoot在线教育系统:用户认证与授权
    摘要随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了在线教育系统的开发全过程。通过分析在线教育系统管理的不足,创建了一个计算机管理在线教育系统的方案。文章介绍了在线教育系统的系统分析部分,包括可行性分析等,系统设计部......
  • PHPStudy 安装tp8 php8.1.3 安装XDbug、redis扩展
    1.1下载php安装包https://windows.php.net/download/1.2下载的的安装包1.3解压解压到D:\phpstudypro\Extensions\php\php8.1.3nts1.4修改php8.1.3的php.ini文件将php8.1.3nts目录下的php.ini-development文件复职一份并改文件名为php.ini。然后可以将php.ini里面的......
  • 『玩转Streamlit』--登录认证机制
    如果你的StreamlitApp中使用的数据的比较敏感,那么,保护这个App及其背后的数据免受未授权访问变得至关重要。无论是出于商业机密的保护、用户隐私的维护,还是为了满足日益严格的合规要求,确保只有经过验证的用户才能访问特定的数据和功能,已成为大部分应用的一个基本需求。登录认证,......
  • Redis底层数据结构 SDS
    SDS字符串在Redis中是很常用的,键值对中的键是字符串类型,值有时也是字符串类型。Redis是用C语言实现的,但是它没有直接使用C语言的char*字符数组来实现字符串,而是自己封装了一个名为简单动态字符串(simpledynamicstring,SDS)的数据结构来表示字符串,也就是Redis的Stri......
  • 一文彻底搞定Spring Security 认证,实现登陆登出功能
    SpringSecurity是一个强大且灵活的安全框架,提供了身份验证(认证)和授权(授权)功能。下面我们将详细介绍SpringSecurity的认证功能流程,并提供自定义实现登录接口的示例,包括自定义认证过滤器和登出功能。一、SpringSecurity认证流程的深入分析SpringSecurity的认证流程是多层......
  • 在Windows中安装Redis
    1、下载Redis下载地址:https://github.com/microsoftarchive/redis选择Release 3.Windows系统中启动和停止RedisWindows系统中启动Redis,直接双击redis-server.exe即可启动Redis服务,redis服务默认端口号为6379双击redis-cli.exe即可启动Redis客户端,默认连接的是本地的Re......
  • Dify 中的 Bearer Token 与 API-Key 鉴权方式
    本文使用Difyv0.10.2版本,在Dify中包括BearerToken与API-Key鉴权这2种方式。console(URL前缀/console/api)和web(URL前缀/api)蓝图使用的是BearerToken鉴权方式,而service_api(URL前缀/v1)蓝图使用的是API-Key鉴权方式。console蓝图通过login_required装饰......