shiro 是比較好用的權(quán)限認(rèn)證框架,Controller 中一般會(huì)可以使用
@RequiresPermissions("article:module")
來做權(quán)限判斷芥永。
但是現(xiàn)在一般的增刪改查都會(huì)抽取到一個(gè)公共的BaseController里面,每個(gè)子類的權(quán)限又不同赎败,由于BaseController是公用的角钩,所以沒辦法寫死權(quán)限,只能在子類里面通過重寫方法來實(shí)現(xiàn)權(quán)限認(rèn)證爬坑。
問題: 子類重寫方法后纠屋,發(fā)現(xiàn)權(quán)限不生效了。
分析: 由于采用的是動(dòng)態(tài)代理的方式創(chuàng)建的Controller實(shí)現(xiàn)權(quán)限盾计,通過Debug會(huì)發(fā)現(xiàn)售担,子類的Request和父類的Request不是同一個(gè)東西了
解決: 在java中使用 final 關(guān)鍵字,使得子類和父類拿到的請(qǐng)求一致
比如父類的新增
/**
* 新增
* @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 上加入權(quán)限
@RequiresPermissions("XXX.add")
@Override
protected void beforeAdd(HttpServletRequest request, ActivityEnum entity) {
}