0.前言

   JWT的全称叫Json Web Token;在前端和后台进行数据交互的时候,在请求头中带上一个token 字符串,这个字符串中保存了用户具有的权限信息。同时也是经过加密的,不容易被破解。
  在项目中,我们使用token来进行权限的鉴定。用户登录信息匹配的时候,我们就获取当前用户具有的api权限标识符。把这些标识符放在放在token中,并返回给客户端(token是进行过加密的,不用担心安全问题)。客户端发送第二请求的时候,就会吧这个token放在请求头中。服务器端的拦截器或者这个请求头信息,并解析出token中的api权限标识符,如果当前请求的标识可以在token中匹配到,那么就通过请求。这就是token鉴权的大致过程。

1.Maven引入JJWT

<!-- https://mvnrepository.com/artifact/io.jsonwebtoken/jjwt -->
<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version>
</dependency>

2. 编写测试代码

public class CreateJwtTest {/*** 使用jjwt创建token* @param*/@Testpublic void test01() {JwtBuilder jwtBuilder = Jwts.builder().setId("123").setSubject("alu4r")//用户相关信息.setIssuedAt(new Date())//设置创建的时间.signWith(SignatureAlgorithm.HS256, "alu4r")//为token加密.claim("key","value");Map<String, Object> map = new HashMap<>();map.put("11", "11");map.put("22", "22");jwtBuilder.setClaims(map);String token = jwtBuilder.compact();System.out.println(token);}/*** 解析jwt token字符串*/@Testpublic void Test02(){String token = "eyJhbGciOiJIUzI1NiJ9.eyIxMSI6IjExIiwiMjIiOiIyMiJ9.JIzRbr5R2D9cfNFgOscGM_PD_mXdW_zJGMWmmc8Ddgs";Claims claims = Jwts.parser().setSigningKey("阿alu4r").parseClaimsJws(token).getBody();//数据都放在了claims中System.out.println(claims.getId()+"==>"+claims.getSubject()+"==>"+claims.getIssuedAt());//获取自定义的claimsSystem.out.println(claims.get("11"));}
}

3.jwt生成和解析token工具类

@Getter
@Setter
@EnableConfigurationProperties(JwtUtils.class)
@ConfigurationProperties(prefix = "jwt.config")
public class JwtUtils {/*** 签名私钥*/private String key;/*** 签名失效时间*/private Long ttl;/*** 解析token,获取claims*/public Claims parseJwt(String token) {Claims claims = Jwts.parser().setSigningKey(key).parseClaimsJws(token).getBody();return claims;}/*** 设置认证token* id : 用户的id* name : 用户名* map : 用户的私有数据*/public String createJwt(String id, String subject, Map<String, Object> map){//设置失效时间//当前毫秒数long now = System.currentTimeMillis();//失效后的毫秒数long exp = now + ttl;//用户相关信息、设置创建的时间、为token加密JwtBuilder jwtBuilder = Jwts.builder().setId(id).setSubject(subject).setIssuedAt(new Date()).signWith(SignatureAlgorithm.HS256, key);//添加私有map数据for (Map.Entry<String, Object> entry : map.entrySet()) {jwtBuilder.claim(entry.getKey(), entry.getValue());}//设置失效的时间jwtBuilder.setExpiration(new Date(exp));String token = jwtBuilder.compact();return token;}
}

  工具类中使用了@ConfigurationProperties(prefix = “jwt.config”)注解,key和有效时间可以在配置文件(yml)中进行配置。

4. 在token中设置api权限

  用户在登录成功的时候,我们可以在数据库中查询当前用户有哪些api权限,把这些api权限的标识放在token中;
  登录控制器:

/**
*Result : 返回到客户端的数据
*Role : 角色
*Permission : 权限
*/
@PostMapping("/login")public Result login(@RequestBody Map<String, String> loginMap){String mobile = loginMap.get("mobile");String password = loginMap.get("password");User user = userService.findByMobile(mobile);Result result = null;if(user == null || !Objects.equals(password,user.getPassword())){result = new Result(ResultCode.MOBILE_OR_PASSWORD);}else {//获取所有的可访问api权限StringBuilder sb = new StringBuilder();for (Role role : user.getRoles()) {for (Permission permission : role.getPermissions()) {if(permission.getType() == PermissionConstants.PERMISSION_API){sb.append(permission.getCode()).append(",");}}}Map<String, Object> map = new HashMap<>();map.put("apis", sb.toString());map.put("companyId",user.getCompanyId());map.put("companyName",user.getCompanyName());//将apis的权限标识符,和其他的一些需要的数据放在token中String token = jwtUtils.createJwt(user.getId(), user.getUsername(), map);result = new Result(ResultCode.SUCCESS,token);}return result;}

5. 解析获取token中的数据

  在项目中我们把解析token的代码放在拦截器中,这样我们就可以对每一个请进行权限验证了

@Component
public class JwtInterceptor extends HandlerInterceptorAdapter {@AutowiredJwtUtils jwtUtils;/*** 进入控制器之前执行的方法*      简化获取token数据的代码的编写*      同一的用户权限校验**  判断用户是否有当前的接口权限* @param request* @param response* @param handler* @return  是否继续执行* @throws Exception*/@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//获取到tokenString authorization = request.getHeader("Authorization");//判断请求头信息是否为空, 或者是否以Bearer开头if(!StringUtils.isEmpty(authorization) && authorization.startsWith("Bearer ")){String token = authorization.replace("Bearer ","");Claims claims = jwtUtils.parseJwt(token);if(claims != null){String apis = (String) claims.get("apis");//通过handler,获取控制器api接口名,也就是PostMapping注解中name中的属性HandlerMethod handlerMethod = (HandlerMethod) handler;RequestMapping methodAnnotation = handlerMethod.getMethodAnnotation(RequestMapping.class);String name = methodAnnotation.name();//如果匹配到权限标识符 就通过请求if(apis.contains(name)){//用来保存私有数据的,request.setAttribute("user_claims",claims);return true;}else {throw new CommonException(ResultCode.UNAUTHORISE);}}}else {throw new CommonException(ResultCode.UNAUTHENTICATED);}return true;}
}

代码是截取项目中的部分,不能保证copy就能运行,不对之处,请多指教!

基于JWT的API权限鉴定相关推荐

  1. 基于JWT的API权限校验:需求分析

  2. ASP.NET Core 实战:基于 Jwt Token 的权限控制全揭露

    一.前言 在涉及到后端项目的开发中,如何实现对于用户权限的管控是需要我们首先考虑的,在实际开发过程中,我们可能会运用一些已经成熟的解决方案帮助我们实现这一功能,而在 Grapefruit.VuCore ...

  3. JWT的API鉴权,基于拦截器的token与鉴权

    基于JWT的API鉴权 基于拦截器的token与鉴权 如果我们每个方法都去写一段代码,冗余度太高,不利于维护,那如何做使我们的代码看起来更清爽呢?我们可以  将这段代码放入拦截器去实现 Spring中 ...

  4. asp.net core 2.0 web api基于JWT自定义策略授权

    JWT(json web token)是一种基于json的身份验证机制,流程如下: 通过登录,来获取Token,再在之后每次请求的Header中追加Authorization为Token的凭据,服务端 ...

  5. REST API 基于ACCESS TOKEN 的权限解决方案

    REST API 基于ACCESS TOKEN 的权限解决方案 参考文章: (1)REST API 基于ACCESS TOKEN 的权限解决方案 (2)https://www.cnblogs.com/ ...

  6. 基于微服务API级权限的技术架构

    一般而言,企业内部一套成熟的权限系统,都是基于角色(Role)的 访问控制方法(RBAC – Role Based Access Control),即权限 (Permission)与角色相关联,用户( ...

  7. 会话管理 轻量php框架_SpringSecurity+JWT权限管理训练营-1基于RBAC模型的权限管理系统...

    1.什么是权限管理系统? 权限管理是一个几乎所有后台系统的都会涉及的一个重要组成部分,可以说是后台项目的基本功,主要目的是对整个后台管理系统进行权限的控制,而针对的对象是员工,避免因权限控制缺失或操作 ...

  8. springboot jwt token前后端分离_实战:十分钟实现基于JWT前后端分离的权限框架

    前言 面试过很多Java开发,能把权限这块说的清楚的实在是不多,很多人因为公司项目职责问题,很难学到这类相关的流程和技术,本文梳理一个简单的场景,实现一个基于jwt前后端分离的权限框架. 简易流程 登 ...

  9. php hook类,基于 CodeIgniter 构建 JWT RESTfull API Server

    CodeIgniter 下载后,解压至当前文件夹,你会得到一个 CodeIgniter-3.1.7 的文件夹,将它重命名为你喜欢的项目名,我的是 JWT-RESTfull-IN-CI-Tutorial ...

  10. 认证鉴权与API权限控制在微服务架构中的设计与实现

    引言: 本文系<认证鉴权与API权限控制在微服务架构中的设计与实现>系列的第一篇,本系列预计四篇文章讲解微服务下的认证鉴权与API权限控制的实现. 1. 背景 最近在做权限相关服务的开发, ...

最新文章

  1. HDR sensor 原理介绍
  2. MTD的坏块管理(一)-快速了解MTD的坏块管理
  3. 低潮过后,未来医疗可穿戴市场将如何发展?
  4. 产品治理体系:产品顶层框架
  5. php 微信开发 菜单,微信公众号中个性化菜单的开发实例
  6. iOS iphone屏幕分析(岂止而大)
  7. 客户每次请求Web页面过程
  8. 搜索 —— 启发式搜索 —— 模拟退火
  9. gin 源码解析 - 详解http请求在gin中的流转过程
  10. 【英语学习】【Daily English】U15 Culture L04 When in Rome, do as the Romans Do
  11. 一張表的數據導入到另一張表
  12. 【CSS】text-align:justify 的使用
  13. Python 使用Protobuf(struct模块)
  14. Windows终端配置emoji
  15. MongoDB和MySQL常用增删改查语句
  16. ac68无线网卡 linux驱动下载,华硕USB-AC68驱动|华硕USB-AC68无线网卡驱动下载 v2.1.2.1官方版 - 121下载站...
  17. SEUS 转换XML到JAVA
  18. 通过优矿API python获取财报
  19. python手机自动点击_通过电脑,模拟点击手机屏幕 /手机自动点击,刷金币?
  20. 绿能宝承载的不单是绿能宝的梦想

热门文章

  1. windows系统排查-文件分析
  2. 公司的苹果开发者账号续费问题
  3. linux ncm网络性能优化,USB linux NCM usbnet驱动详解
  4. 【工具篇】ip2domain - 批量ip反查域名及备案信息工具
  5. 基于libexif写入/读取自定义Exif 信息(曝光模式,感光度,GPS等信息)
  6. 【git】小甲鱼Git教程《极客Python之Git实用教程》笔记二
  7. Python视频制作 MoviePy框架音频处理模块
  8. ET6.0服务器框架学习笔记(一、启动配置)
  9. 服务器对比个人计算机,服务器与一般电脑有何区别,为什么差价很大?
  10. postfix搭建纯邮件转发服务器