简述
看这一篇文章需要结合我上一篇文章来看,这里代码实现我不会再全部粘上,这一篇没有的上一篇都有。
这一篇只是在原有的基础上添加了一些新的特性。
实现流程
- 定义角色分配的参数(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);