Shiro @RequiresRoles注解不生效解决方案及相应设置

来源:互联网 发布:淘宝详情页制作技巧 编辑:程序博客网 时间:2024/06/03 22:55

刚开始集成的时候@RequiresRoles和@RequiresPermissions注解一直不生效,只能进入方法之后在代码中判断

        Subject subject= SecurityUtils.getSubject();        try {            subject.checkPermissions("add","update");        }catch (UnauthorizedException e){            log.info("错误信息:"+e.getMessage());            //TODO 定义错误处理页面            log.info("权限不足");        }

后来查了下发现注解必须必须要使用相应的bean才能生效:

    @Bean    public static LifecycleBeanPostProcessor getLifecycleBeanPostProcessor() {        return new LifecycleBeanPostProcessor();    }    @Bean    public static DefaultAdvisorAutoProxyCreator getDefaultAdvisorAutoProxyCreator(){        return new DefaultAdvisorAutoProxyCreator();    }

网上搜的时候这俩bean是在一起的,LifecycleBeanPostProcessor 是管理shiro生命周期的,不直接跟权限注解关联。所以加上DefaultAdvisorAutoProxyCreator 这个bean就可以了。

在代码中通过subject控制跟使用注解两种方式功能是一样的,但是有些时候必须要用注解:

    @RequiresRoles(value={"admin","user"},logical = Logical.OR)    @RequiresPermissions(value={"add","update"},logical = Logical.AND)

如果有多个权限/角色验证的时候中间用“,”隔开,默认是所有列出的权限/角色必须同时满足才生效。但是在注解中有logical = Logical.OR这块。这里可以让权限控制更灵活些。

如果将这里设置成OR,表示所列出的条件只要满足其中一个就可以,如果不写或者设置成logical = Logical.AND,表示所有列出的都必须满足才能进入方法。

用subject这种通过代码控制的方法我没有深入了解,所以没有找到这种权限的控制。再加上使用注解更加简洁明了,所以个人更倾向于使用注解方式来控制。

如果抛出异常就写个专门处理shiro异常处理的类,可以参考我前面的文章Spring Boot集成无状态Shiro–内容详细介绍