使用拦截器和JWT实现Java后端接口的权限访问控制

最近发现,后端接口的权限访问控制通过使用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)

你可能感兴趣的:(java,后端,开发语言)