密码加密与微服务鉴权JWT-发布信息验证Token
发布信息验证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,"增加成功");
}