美文网首页
Spring MVC + Shiro 中 BaseControl

Spring MVC + Shiro 中 BaseControl

作者: 燃英 | 来源:发表于2018-09-25 10:19 被阅读0次

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) {
    }

相关文章

网友评论

      本文标题:Spring MVC + Shiro 中 BaseControl

      本文链接:https://www.haomeiwen.com/subject/jmpkoftx.html