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

发布于:2025-02-10 ⋅ 阅读:(50) ⋅ 点赞:(0)

【全栈】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,实现了这一功能。


网站公告

今日签到

点亮在社区的每一天
去签到