【全栈】SprintBoot+vue3迷你商城(5)
【全栈】SprintBoot+vue3迷你商城(5)
上一期我们基本完成了与用户相关的接口,而这些接口都是用户才能干的事情,如果你没登录,那么这些接口功能你都不能实现。
那么如何做到这一步呢?
1.Token
作用
- 身份验证:
- 用户登录时,系统会验证用户的凭据(如用户名和密码)。如果凭据正确,服务器会给用户签发一个 token。这个 token 作为后续请求的身份验证依据,代替了每次请求都发送用户名和密码。
- 授权:
- Token 还可以包含有关用户权限的信息,即用户被允许访问的资源或执行的操作。当用户尝试访问受保护的资源时,服务器可以通过解析 token 来检查用户是否有足够的权限。
实际
还记得我们在实现登录接口时需要返回一个Token
吗?
我们登录之后,给我们一个Token
,我们将这个Token
存储在redis
中,当我们想要实现用户相关的接口时,我们可以访问该请求的Authorization
,里面存的正是Token
2.拦截器
为此我们可以做一个拦截器LoginInterceptor
我们将储存在redis
中的这个Token
与Authorization
中的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,实现了这一功能。