全方位解析双 Token实现无感刷新:用 Spring Boot + Vue + Redis 构建高安全认证体系

前言:

随着Web应用需求的增加,如何保障用户数据和信息的安全,成为了开发者关注的重要问题。传统的单Token认证方法虽然简便,但在长时间使用或高频请求下,可能带来一定的安全隐患。双Token身份认证机制提供了一种更加安全且高效的方式,本文将详细介绍如何在Spring Boot和Vue中实现双Token认证。同时在单token进行操作时,也会遇到token到期而需要频繁登录的问题,使用双token就能很好地解决这个问题!

双Token介绍:

双Token认证机制是基于OAuth2.0标准的一种增强型身份认证方式,主要通过两个Token:访问Token(Access Token)刷新Token(Refresh Token),来分别处理认证与授权问题。

单Token VS 双Token

单Token:用户登录后,返回一个Token,用户每次请求都需要携带此Token进行身份认证。缺点是,Token一旦被盗取或泄露,恶意用户可以长时间访问系统,且Token有效期通常较长,若用户频繁使用系统,Token有效期过长也可能造成不便。

双Token:通过使用两个Token来提高安全性和用户体验。访问Token:短期有效,用于每次请求时验证身份,确保用户认证的实时性。刷新Token:长期有效,用于刷新过期的访问Token,避免频繁登录。

具体流程:

  1. 用户登录后生成token(过期时间短)和refreshToken(过期时间长),token和refreshToken先返回前端并保存到localstroage中,同时再将refreshToken保存到Redis中
  2. 前端请求头中携带token进行普通路径的方法调用
  3. 当token失效,过滤器中发现错误并返回前端
  4. 前端根据错误请求头携带上refreshToken并调用后端中更新token的方法
  5. 此时再次进入过滤器中,token还是报错,但是此时能检查到refreshToken,调用更新token的方法
  6. 在更新token的方法中,先检查当前的refreshToken是否存在与Redis中,若不存在,则说明refreshToken也过期了,用户需要重新登录
  7. 若Redis中存在refreshToken与当前的refreshToken对应,则说明是当前的短token过期了,重新生成token和refreshToken并返回前端,同时将新refreshToken存到Redis中?

详细操作:

首先这是我们暂时的登录与过滤器中的流程。只实现了单Token的生成及校验。

@Override
    public ResponseResult login(User user) {
        //1.构造用户名密码认证信息
        UsernamePasswordAuthenticationToken authenticationToken =
                new UsernamePasswordAuthenticationToken(user.getPhoneNumber(), user.getPassword());
        //2.使用SpringSecurity 中用于封装用户名密码认证信息的UsernamePasswordAuthenticationToken来进行认证
        //这里会进行账号密码校验,不成功会报403
        Authentication authenticate = authenticationManager.authenticate(authenticationToken);
        //3.认证不通过报错
        if(Objects.isNull(authenticate)){
            throw new RuntimeException("登录失败");
        }
        //4.认证通过则生成token
        LoginUser loginUser= (LoginUser) authenticate.getPrincipal();
        String userId = loginUser.getUser().getId().toString();
        String role = loginUser.getUser().getRole();
        String token = JwtUtil.createJWT(userId,role);//将userId进行token生成
        //4.1如果用户被禁用则无法登录
        String userStatus = userService.selectUserStatusByUserId(Long.valueOf(userId));
        if(userStatus.equals("banned")){
            return ResponseResult.error("您已被禁用,无法登录");
        }
        //5.封装数据到Redis中
        redisCache.setCacheObject(LOGIN_USER_KEY+userId,loginUser,LOGIN_USER_TTL, TimeUnit.MINUTES);
        //6.最后将token返回前端
        HashMap<String, String> map = n
### 关于 `ModuleNotFoundError` 和 `cv2.mat_wrapper` 当遇到 `pip install numpy` 报错 `ModuleNotFoundError` 或者涉及 `cv2.mat_wrapper` 的问题时,通常是因为依赖项未正确安装或者环境配置存在问题。以下是详细的分析和解决方案: #### 1. **关于 `ModuleNotFoundError: No module named 'numpy'`** 此错误表明当前 Python 环境中缺少 NumPy 库。可以通过以下方法解决: - 使用 pip 安装 NumPy: ```bash pip install numpy ``` - 如果是在 Conda 虚拟环境中工作,则建议使用 conda 命令来管理包,因为 Conda 更适合处理科学计算库及其依赖关系: ```bash conda install numpy ``` 如果仍然报错,可能的原因包括: - 当前使用的不是目标虚拟环境,请激活正确的虚拟环境后再尝试安装。 - 存在多个 Python 版本冲突的情况,可以显式指定版本号进行安装: ```bash python3.7 -m pip install numpy ``` --- #### 2. **关于 OpenCV (`cv2`) 中的 `mat_wrapper`** OpenCV 并不存在名为 `cv2.mat_wrapper` 的模块或功能[^3]。这可能是由于误解或者是某些特定场景下的自定义封装函数引起的。 如果你希望操作矩阵数据结构(类似于 MATLAB 的 Matrix),可以直接利用 OpenCV 提供的核心类 `cv::Mat` 来实现图像或其他二维数组的操作。例如,在 Python 接口中,`cv2` 已经集成了 NumPy 数组的支持,因此你可以无缝转换两者之间的数据格式。 下面是一个简单的例子展示如何读取图片并将其作为 NumPy 数组处理: ```python import cv2 # 加载一张彩色图片 image_path = 'example_image.jpg' img = cv2.imread(image_path) if img is None: raise ValueError(f"无法加载图片 {image_path}") # 将 BGR 格式的图片转为 RGB 格式 rgb_img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) print(rgb_img.shape) # 输出形状 (height, width, channels) ``` 注意这里并没有提到所谓的 `mat_wrapper` 方法;如果有特殊需求需要用到该名称的功能,请确认是否有额外扩展库引入了这个特性。 --- #### 3. **综合考虑 PyInstaller 打包 Miniconda 环境中的复杂项目** 对于基于 Miniconda 构建的虚拟环境下包含 PyQt5、OpenCV、MediaPipe 及深度学习模型的应用程序来说,直接通过 PyInstaller 进行打包可能会面临诸多挑战,比如动态链接库缺失等问题[^1]。为了减少潜在风险,推荐执行如下措施之一或多条组合策略: - 明确列出所有必要依赖,并确保它们都被成功导入至最终可执行文件之中; - 对于 GPU 支持部分,需特别留意 TensorFlow 是否能够正常检测到硬件资源可用情况[^2]: ```python import tensorflow as tf if tf.config.list_physical_devices('GPU'): device_name = tf.test.gpu_device_name() else: device_name = '/CPU:0' print(f'Device name: {device_name}') ``` 最后提醒一点——务必验证生成后的独立应用程序能否脱离开发机器运行良好! ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值