上一篇介绍了自定义注解Annotation的一些分类和写法,现在来结合权限模块,具体说一下实现方式。
一、说明
相对于Shiro等权限框架,通过注解自定义实现起来更加贴合我们的项目需求,没有其他累赘功能,扩展性也很好,根据项目需求可以随时添加新功能。
本系统中的每个权限对应一个唯一字符串,这个字符串需要在数据库中预先设定好。在用户登录的时候,获取到用户绑定的角色,再遍历角色中的所有权限,从而获取到该用户所拥有的所有权限。
二、页面用法
这些权限存储在session中,例:session.setAttribute("xxx权限", true);,这样可以直接在页面中通过c:if判断权限(注:权限字符串中如果有"-",需要在存储到session权限去掉"-")。
三、类中的用法
优点:支持json格式,当权限错误时可以直接返回给客户端,适合ajax调用的接口。
1.在需要验证权限的方法上加上注解
例:
@RequestLog(permission="xxx权限") public void xxMethod(){}
2.在拦截器中添加相关代码
在preHandle中添加:
if (handler.getClass().isAssignableFrom(HandlerMethod.class)) { HandlerMethod handlerMethod = (HandlerMethod) handler; RequestLog requestLog = handlerMethod.getMethodAnnotation(RequestLog.class); User user = null; if (requestLog != null) { //....其他日志操作 //判断权限 if (!Strings.isEmpty(requestLog.permission()) && user.getUserType() != User.USER_TYPE_ADMIN) { System.out.println(requestLog.permission()); boolean per = permissionService.findByUserAndValue(user.getUid(), requestLog.permission()); if (!per) { Map map = new HashMap<>(); PrintWriter pw = null; fateRequestService.returnError(map, ErrorCodes.PERMISSION_ERROR, "权限不足", fateRequest.getRequestId(), 200, LOG); Gson gson = GsonUtil.getGson(); response.setContentType("text/javascript; charset=utf-8"); pw = response.getWriter(); pw.write(gson.toJson(map)); pw.flush(); return false; } } } }
注:写在方法上的时候不需要对权限名称进行过滤。