shiro 是比较好用的权限认证框架,Controller 中一般会可以使用
@RequiresPermissions("article:module")
来做权限判断。
但是现在一般的增删改查都会抽取到一个公共的BaseController里面,每个子类的权限又不同,由于BaseController是公用的,所以没办法写死权限,只能在子类里面通过重写方法来实现权限认证。
问题: 子类重写方法后,发现权限不生效了。
分析: 由于采用的是动态代理的方式创建的Controller实现权限,通过Debug会发现,子类的Request和父类的Request不是同一个东西了
解决: 在java中使用 final 关键字,使得子类和父类拿到的请求一致
比如父类的新增
/**
* 新增
* @param request HttpServletRequest
* @return ResponseResult
*/
@RequestMapping(value = "/add",method = RequestMethod.POST)
@ResponseBody
public final ResponseResult<T> add(HttpServletRequest request, HttpSession session, @Valid T entity) {
try{
beforeAdd(request, entity);
}catch (AuthorizationException e) {
return getPermissionsErrorResult();
}
return doAdd(request, session, entity);
}
/**
* 子类可重写此方法
* @param request HttpServletRequest
* @param session HttpSession
* @param entity T
* @return ResponseResult
*/
protected ResponseResult<T> doAdd(HttpServletRequest request, HttpSession session, T entity) {
ResponseResult<T> result = new ResponseResult<T>();
try {
baseService.doAdd(entity);
result.setObj(entity);
} catch (Exception e) {
result.setFlag(false);
result.setMessage(e.getMessage());
result.setCode(ERROR_CODE);
e.printStackTrace();
}
return result;
}
子类重写 beforeAdd 方法,并且在 beforeAdd 上加入权限
@RequiresPermissions("XXX.add")
@Override
protected void beforeAdd(HttpServletRequest request, ActivityEnum entity) {
}
网友评论