密码加密与微服务鉴权JWT-发布信息验证Token

本文详细介绍如何在微服务架构中使用JSON Web Tokens (JWT)实现用户认证与授权。涵盖JWT的生成、验证流程,以及如何在Spring Boot项目中集成JWT,包括配置、拦截器的实现和控制器的修改。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

发布信息验证Token

用户登陆签发 JWT

1)修改UserController中的logo方法,增加昵称、头像等信息

修改UserController,引入JwtUtil 修改login方法 ,返回token,昵称,头像等信息

	@RequestMapping(value = "/login", method = RequestMethod.POST)
	public Result login(@RequestBody User user){
		user = userService.login(user.getMobile(), user.getPassword());
		if(user==null){
			return new Result(false, StatusCode.LOGINERROR, "登录失败");
		}
		String token = jwtUtil.createJWT(user.getId(), user.getMobile(), "user");
		Map<String, Object> map = new HashMap<>();
		map.put("token", token);
		map.put("roles", "user");
		map.put("name",user.getNickname());    // 昵称
		map.put("avatar",user.getAvatar());    // 头像 
		return new Result(true, StatusCode.OK, "登录成功", map);
	}

2)测试运行

测试运行 http://localhost:9008/user/login (POST) ,结果为如下形式

{
  "flag": true,
  "code": 20000,
  "message": "登陆成功",
  "data": {
      "token":"eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiI5ODM5ODc0ODk1MDcyNTAxNzYiLCJpYXQiOjE1MjM1MDIzMDEsInJvbGVzIjoidXNlciIsImV4cCI6MTUyMzUwMjY2MX0.QH‐WMRgIAxHDcYReH7patg7qkcjc4ZuyDbHaIah‐spQ"
  },
  "name":"小雅",
  "avatar":"......."
}

发布问题

1)修改tensquare_qa工程的QaApplication,增加bean

	@Bean
	public JwtUtil jwtUtil(){
		return new JwtUtil();
	}

2)tensquare_qa工程配置文件application.yml增加配置

jwt:
  config:
    key: youcan
    ttl: 3600000

3)增加拦截器类

package com.tensquare.qa.interceptor;

import io.jsonwebtoken.Claims;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import util.JwtUtil;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Component
public class JwtInterceptor implements HandlerInterceptor{
    @Autowired
    private JwtUtil jwtUtil;

    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("经过了拦截器");
        //无论如何都放行。具体能不能操作还是在具体的操作中去判断。
        //拦截器只是负责把头请求头中包含token的令牌进行一个解析验证。
        String header = request.getHeader("Authorization");

        if(header!=null && !"".equals(header)){
            //如果有包含有Authorization头信息,就对其进行解析
            if(header.startsWith("Bearer ")){
                //得到token
                String token = header.substring(7);
                //对令牌进行验证
                try {
                    Claims claims = jwtUtil.parseJWT(token);
                    String roles = (String) claims.get("roles");
                    if(roles!=null && roles.equals("admin")){
                        request.setAttribute("claims_admin", token);
                    }
                    if(roles!=null && roles.equals("user")){
                        request.setAttribute("claims_user", token);
                    }
                }catch (Exception e){
                    throw new RuntimeException("令牌不正确!");
                }
            }
        }
        return true;
    }
}

4)增加配置类ApplicationConfig

package com.tensquare.qa.config;

import com.tensquare.qa.interceptor.JwtInterceptor;
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.WebMvcConfigurationSupport;

@Configuration
public class InterceptorConfig extends WebMvcConfigurationSupport {
    @Autowired
    private JwtInterceptor jwtInterceptor;
    protected void addInterceptors(InterceptorRegistry registry) {
        //注册拦截器要声明拦截器对象和要拦截的请求
        registry.addInterceptor(jwtInterceptor)
                .addPathPatterns("/**")
                .excludePathPatterns("/**/login/**");
    }
}

5)修改ProblemController的add方法

	/**
	 * 增加
	 * @param problem
	 */
	@RequestMapping(method=RequestMethod.POST)
	public Result add(@RequestBody Problem problem  ){
		String token = (String) request.getAttribute("claims_user");
		if(token==null || "".equals(token)){
			return new Result(false, StatusCode.ACCESSERROR, "权限不足");
		}
		problemService.add(problem);
		return new Result(true,StatusCode.OK,"增加成功");
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值