当前位置: 首页 > article >正文

【全栈】SprintBoot+vue3迷你商城(5)

【全栈】SprintBoot+vue3迷你商城(5)

上一期我们基本完成了与用户相关的接口,而这些接口都是用户才能干的事情,如果你没登录,那么这些接口功能你都不能实现。

那么如何做到这一步呢?

1.Token

作用

  1. 身份验证
    • 用户登录时,系统会验证用户的凭据(如用户名和密码)。如果凭据正确,服务器会给用户签发一个 token。这个 token 作为后续请求的身份验证依据,代替了每次请求都发送用户名和密码。
  2. 授权
    • Token 还可以包含有关用户权限的信息,即用户被允许访问的资源或执行的操作。当用户尝试访问受保护的资源时,服务器可以通过解析 token 来检查用户是否有足够的权限。

实际

还记得我们在实现登录接口时需要返回一个Token吗?

我们登录之后,给我们一个Token,我们将这个Token存储在redis中,当我们想要实现用户相关的接口时,我们可以访问该请求的Authorization,里面存的正是Token

2.拦截器

为此我们可以做一个拦截器LoginInterceptor

我们将储存在redis中的这个TokenAuthorization中的Token对比,如果相等,则放行;如果不相等,则拦截

当然,登录和注册这个接口就不需要制定拦截器了

LoginInterceptor

package com.janium.minimallbe.interceptor;

import com.janium.minimallbe.utils.JwtUtil;
import com.janium.minimallbe.utils.ThreadLocalUtil;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import java.util.Map;

@Component
public class LoginInterceptor implements HandlerInterceptor {
    @Autowired
    StringRedisTemplate stringRedisTemplate;
    @Override
    public boolean preHandle(final HttpServletRequest request, final HttpServletResponse response,
                             final Object handler) throws Exception {
        String token = request.getHeader("Authorization");
        try {
            ValueOperations<String, String> operations = stringRedisTemplate.opsForValue();
            String redisToken = operations.get(token);
            if (redisToken == null) {
                throw new RuntimeException();
            }
            Map<String, Object> claims = JwtUtil.parseToken(token);
            ThreadLocalUtil.set(claims);
            return true;
        } catch (Exception e) {
            response.setStatus(401);
            return false;
        }

    }

    @Override
    public void postHandle(final HttpServletRequest request, final HttpServletResponse response, final Object handler,
                           final ModelAndView modelAndView) throws Exception {
        ThreadLocalUtil.remove();
    }
}

3.将拦截器添加到配置中去

WebConfig

package com.janium.minimallbe.config;


import com.janium.minimallbe.interceptor.LoginInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Autowired
    private LoginInterceptor loginInterceptor;
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(loginInterceptor).excludePathPatterns("/user/login","/user/register");
    }
}

4.测试

如果我们未登录直接访问用户相关接口,那么则会有这种效果:

在这里插入图片描述

5.总结

本期我们加上了访问用户相关接口的权限,通过制定拦截器,利用了之前登录接口返回的Token,实现了这一功能。


http://www.kler.cn/a/513527.html

相关文章:

  • HarmonyOS NEXT:华为分享-碰一碰开发分享
  • 讯飞星火大模型将超越chatgpt?
  • 力扣11-最后一个单词的长度
  • 【云岚到家】-day03-门户缓存实现实战
  • Java 多态/向下转型/instanceof
  • Scade 表达式 - 迭代器
  • 经验收录/用复盘的心态去学习
  • Stable Diffusion 提示词编写技巧及示例
  • 4.6.3递归算法
  • RTK定位
  • 常用排序算法之插入排序
  • Linux_线程概念
  • CentOS 7 下安装RabbitMQ教程_centos启动rabbitmq
  • 分享源代码防泄露实战经验
  • Three.js实战项目01:vue3+three.js实现圣诞动画贺卡项目
  • 99.9 金融难点通俗解释:总资产收益率(ROA)
  • Spingboot整合Netty,简单示例
  • HJ108 求最小公倍数(Java版本)
  • Nim游戏算法问题(Java)
  • 颜色分配问题
  • 深入理解 Java 的数据类型与运算符
  • Cannot resolve symbol ‘XXX‘ Maven 依赖问题的解决过程
  • 55.命名、驼峰式、帕斯卡式 C#例子
  • MySQL表创建分区键
  • 37.构造回文字符串问题|Marscode AI刷题
  • PHP语言的网络编程