jwt 权限校验分配

springboot整合jwt,实现token验证(入门)


简述

看这一篇文章需要结合我上一篇文章来看,这里代码实现我不会再全部粘上,这一篇没有的上一篇都有。
这一篇只是在原有的基础上添加了一些新的特性。

实现流程

  • 定义角色分配的参数(role),存放到数据库中。
  • 登录的时候,从数据库中取出定义的权限参数,生成到token当中。
  • 从token中解析出role字段值。用于区分权限。(在这里我自定义了个注解)
  • 解析token中的role和我注解分配的值比对。

代码实现


1、自定义注解

/**
 * 权限注解
 * @author jk
 */
@Target({
    
    ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface RolePermission {
    
    

    /**
     * 登录权限
     * @return
     */
    boolean login() default true;

    /**
     *角色权限
     * @return
     */
    String role() default "";
}
假如这个接口我只能让管理员调用的到,我就在接口方法上加上这个自定义注解
	
例如:		

在这里插入图片描述

解释
	例如: 注解中的(role="1,2,3")这个注解的作用是 :如果解析token ,token中携带着含有role值等于1,2,3中的其中一个的话这个接口都可以访问。

2、生成token和校验token都要加入role值
在这里插入图片描述

3、解析token获取role值
在这里插入图片描述
这里将代码粘上

/**
     * 解析token获取role
     * @param request
     * @return
     */
    public static String getRoleByToken(HttpServletRequest request)  {
    
    
        String token = request.getHeader("token");
        DecodedJWT jwt = JWT.decode(token);
        return jwt.getClaim("role")
                .asString();
    }

4、角色权限校验
在这里插入图片描述

   @Override
   public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    
    
        // 从 http 请求头中取出 token
        String token = request.getHeader("token");
        // 如果不是映射到方法直接通过
        if(!(handler instanceof HandlerMethod)){
    
    
            return true;
        }
		  HandlerMethod handlerMethod=(HandlerMethod) handler;
	      Method method = handlerMethod.getMethod();
	      if(method.isAnnotationPresent(RolePermission.class)){
    
    
	          RolePermission annotation = method.getAnnotation(RolePermission.class);
	          if(!annotation.login()){
    
    
	              return true;
	          }
	      }
         if (token != null){
    
    
            int id = JwtUtil.getIdByToken(request);
            String number=JwtUtil.getNumberByToken(request);
            String role=JwtUtil.getRoleByToken(request);
            
            if(method.isAnnotationPresent(RolePermission.class)){
    
    
                RolePermission annotation = method.getAnnotation(RolePermission.class);
                String roleRolePermission = annotation.role();
                if(StringUtils.isBlank(roleRolePermission)){
    
    
                    throw new BaseException("接口权限获取失败");
                }
                int i = roleRolePermission.indexOf(role);
                if(i==-1){
    
    
                    throw new BaseException("用户权限不足");
                }
            }
//            解密token信息
            boolean result = JwtUtil.verify(token,id,number,role,secret);
            if(result){
    
    
                System.out.println("通过拦截器");
                return true;
            }
        }
        return false;
    }

5、实现角色校验功能

当用户登录的时候调用下面方法生成带有role值的token,然后实现上面的代码逻辑

这个一般放到登录逻辑中生成token 我就是放到登录逻辑(impl)中的。

  String token = JwtUtil.sign(id,role,secret);

Guess you like

Origin blog.csdn.net/CSDN_java1005/article/details/116133956
jwt