项目里的应用"/>
jwt生成token在项目里的应用
JWT工具类编写
(1)tensquare_common工程引入依赖(考虑到工具类的通用性)
<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.6.0</version></dependency>
(2)修改tensquare_common工程,创建util.JwtUtil
@ConfigurationProperties("jwt.config")
public class JwtUtil {private String key ;private long ttl ;//一个小时public String getKey() {return key;}public void setKey(String key) {this.key = key;}public long getTtl() {return ttl;}public void setTtl(long ttl) {this.ttl = ttl;}/*** 生成JWT** @param id* @param subject* @return*/public String createJWT(String id, String subject, String roles) {long nowMillis = System.currentTimeMillis();Date now = new Date(nowMillis);JwtBuilder builder = Jwts.builder().setId(id).setSubject(subject).setIssuedAt(now).signWith(SignatureAlgorithm.HS256, key).claim("roles", roles);if (ttl > 0) {builder.setExpiration( new Date( nowMillis + ttl));}return builderpact();}/*** 解析JWT* @param jwtStr* @return*/public Claims parseJWT(String jwtStr){return Jwts.parser().setSigningKey(key).parseClaimsJws(jwtStr).getBody();}}
(3)修改tensquare_user工程的application.yml, 添加配置
jwt:config:key: itcastttl: 3600000
## 2 管理员登陆后台签发token
(1)配置bean .修改tensquare_user工程Application类
@Beanpublic JwtUtil jwtUtil(){return new JwtUtil();}
(2)修改AdminController的login方法
@Autowiredprivate JwtUtil jwtUtil;/*** 用户登陆* @param loginname* @param password* @return*/@RequestMapping(value="/login",method=RequestMethod.POST)public Result login(@RequestBody Map<String,String> loginMap){Admin admin = adminService.findByLoginnameAndPassword(loginMap.get("loginname"), loginMap.get("password"));if(admin!=null){//生成tokenString token = jwtUtil.createJWT(admin.getId(), admin.getLoginname(), "admin");Map map=new HashMap();map.put("token",token);map.put("name",admin.getLoginname());//登陆名return new Result(true,StatusCode.OK,"登陆成功",map);}else{return new Result(false,StatusCode.LOGINERROR,"用户名或密码错误");}}
测试运行结果
{"flag": true,"code": 20000,"message": "登陆成功","data": {"token": "eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiI5ODQzMjc1MDc4ODI5MzgzNjgiLCJzdWIiOiJ4aWFvbWkiLCJpYXQiOjE1MjM1MjQxNTksInJvbGVzIjoiYWRtaW4iLCJleHAiOjE1MjM1MjQ1MTl9._YF3oftRNTbq9WCD8Jg1tqcez3cSWoQiDIxMuPmp73o","name":"admin"}
}
3 删除用户功能鉴权
需求:删除用户,必须拥有管理员权限,否则不能删除。
前后端约定:前端请求微服务时需要添加头信息Authorization ,内容为Bearer+空格+token
(1)修改UserController的delete方法 ,判断请求中的头信息,提取token并验证权限。
@Autowiredprivate HttpServletRequest request;/*** 删除* @param id*/@RequestMapping(value="/{id}",method= RequestMethod.DELETE)public Result delete(@PathVariable String id ){String authHeader = request.getHeader("Authorization");//获取头信息if(authHeader==null){return new Result(false,StatusCode.ACCESSERROR,"权限不足");}if(!authHeader.startsWith("Bearer ")){return new Result(false,StatusCode.ACCESSERROR,"权限不足");}String token=authHeader.substring(7);//提取tokenClaims claims = jwtUtil.parseJWT(token);if(claims==null){return new Result(false,StatusCode.ACCESSERROR,"权限不足");}if(!"admin".equals(claims.get("roles"))){return new Result(false,StatusCode.ACCESSERROR,"权限不足");}userService.deleteById(id);return new Result(true,StatusCode.OK,"删除成功");}
4 ## 使用拦截器方式实现token鉴权
如果我们每个方法都去写一段代码,冗余度太高,不利于维护,那如何做使我们的代码看起来更清爽呢?我们可以将这段代码放入拦截器去实现
4.1 添加拦截器
Spring为我们提供了org.springframework.web.servlet.handler.HandlerInterceptorAdapter这个适配器,继承此类,可以非常方便的实现自己的拦截器。他有三个方法:
分别实现预处理、后处理(调用了Service并返回ModelAndView,但未进行页面渲染)、返回处理(已经渲染了页面)
在preHandle中,可以进行编码、安全控制等处理;
在postHandle中,有机会修改ModelAndView;
在afterCompletion中,可以根据ex是否为null判断是否发生了异常,进行日志记录。
(1)创建拦截器类。创建 com.tensquare.user.interceptor
@Component
public class JwtInterceptor extends HandlerInterceptorAdapter {@Autowiredprivate JwtUtil jwtUtil;@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception {System.out.println("经过了拦截器");return true;}
}
(2)配置拦截器类,创建com.tensquare.user.ApplicationConfig
@Configuration
public class ApplicationConfig extends WebMvcConfigurationSupport {@Autowiredprivate JwtInterceptor jwtInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(jwtInterceptor).addPathPatterns("/**").excludePathPatterns("/**/login");}
}
更多推荐
jwt生成token在项目里的应用
发布评论