最近发现,后端接口的权限访问控制通过使用springmvc里面的拦截器,就能够实现,方法比较简单,这里做一些总结。
1、在登录接口查询数据库中的用户信息和权限信息,得到当前用户相关的权限,然后把权限信息添加到JWT的字符串里面,经过加密以后生成token,将token作为响应数据,传递给前端。
2、定义一个拦截器,从请求头当中取出token,对token进行解密,得到里面的权限信息,然后获取当前访问接口的名称,与token中的权限信息进行比对,如果用户拥有当前接口的权限,就允许访问,否则就抛异常,代码如下
@Component public class JwtInterceptor implements HandlerInterceptor { @Autowired private JWTUtils jwtUtils; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String authorization = request.getHeader("Authorization"); if (!ObjectUtils.isEmpty(authorization) && authorization.startsWith("Bearer")){ String token = authorization.replace("Bearer ", ""); DecodedJWT jwt = jwtUtils.verifyToken(token); if (jwt!=null){ //判断token是否拥有接口的权限 HandlerMethod handlerMethod= (HandlerMethod) handler; String name = handlerMethod.getMethodAnnotation(RequestMapping.class).name(); String perms = jwt.getClaim("perms").asString(); if (perms.contains(name)){ request.setAttribute("user_jwt",jwt); return true; } throw new CommonException(ResultCode.UNAUTHORISE); } } throw new CommonException(ResultCode.UNAUTHENTICATED); } }
3、在接口的注解部分,加上name属性,用于和权限标识进行比对,代码如下
@PostMapping(value = "/user",name = "user-save") public Result save(@RequestBody User user)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)