Shiro @RequiresPermissions不生效原因及解决方案

 更新时间:2026年05月28日 09:09:44   作者:Mr.Java.  
Shiro@rio@RequiresPermissions不生效的原因分析,包括AOP配置和权限写写法错误,帮助开发者正确配置AOP依赖和理解权限写法,以确保权限检查功能正常运行

Shiro @RequiresPermissions不生效原因

原因一、AOP不生效导致

检查maven,添加AOP依赖:

        <!-- AOP依赖,必须,否则shiro权限拦截验证不生效 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>

检查代码,开启了注解支持

    /**
     * Shiro生命周期处理器
     */
    @Bean(name = "lifecycleBeanPostProcessor")
    public static LifecycleBeanPostProcessor getLifecycleBeanPostProcessor() {
        return new LifecycleBeanPostProcessor();
    }

    /**
     * 开启Shiro的注解(如@RequiresRoles,@RequiresPermissions),需借助SpringAOP扫描使用Shiro注解的类,并在必要时进行安全逻辑验证
     */
    @Bean
    @DependsOn("lifecycleBeanPostProcessor")
    public DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator() {
        DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator = new DefaultAdvisorAutoProxyCreator();
        advisorAutoProxyCreator.setProxyTargetClass(true);
        return advisorAutoProxyCreator;
    }

    /**
     * 开启Shiro-aop注解支持
     */
    @Bean
    public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) {
        AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();
        authorizationAttributeSourceAdvisor.setSecurityManager(securityManager);
        return authorizationAttributeSourceAdvisor;
    }

原因二、@RequiresPermissions 写法含有(冒号: 逗号, 星号*)

源码校验权限的时候,会调用 

org.apache.shiro.realm.AuthorizingRealm#isPermitted(org.apache.shiro.authz.Permission, org.apache.shiro.authz.AuthorizationInfo)

源码:

org.apache.shiro.authz.permission.WildcardPermission#implies

 public boolean implies(Permission p) {
        // By default only supports comparisons with other WildcardPermissions
        if (!(p instanceof WildcardPermission)) {
            return false;
        }

        WildcardPermission wp = (WildcardPermission) p;

        List<Set<String>> otherParts = wp.getParts();

        int i = 0;
        for (Set<String> otherPart : otherParts) {
            // If this permission has less parts than the other permission, everything after the number of parts contained
            // in this permission is automatically implied, so return true
            if (getParts().size() - 1 < i) {
                return true;
            } else {
                Set<String> part = getParts().get(i);
                if (!part.contains(WILDCARD_TOKEN) && !part.containsAll(otherPart)) {
                    return false;
                }
                i++;
            }
        }

        // If this permission has more parts than the other parts, only imply it if all of the other parts are wildcards
        for (; i < getParts().size(); i++) {
            Set<String> part = getParts().get(i);
            if (!part.contains(WILDCARD_TOKEN)) {
                return false;
            }
        }

        return true;
    }

含有(冒号: 逗号, 星号*)会前缀匹配放权,

例如:

A用户有 sys:role 的权限,那么 @RequiresPermissions("sys:role:add")对它来说,也可以。

就是 sys:role 拥有了 sys:role:* 的权限,不管 sys:role:add 还是 sys:role:delete 都无法拦截它。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 从java8升级java17的一些调整总结

    从java8升级java17的一些调整总结

    在过去的几年里,Java经历了多次版本升级,从JDK8到JDK17,每一次升级都带来了许多新的特性和改进,这篇文章主要介绍了从java8升级java17的一些调整,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2026-03-03
  • java输出数组的实现方式

    java输出数组的实现方式

    数组输入输出对初学者较复杂,可使用单个元素输出或Arrays.toString()方法输出整个数组,后者需传入数组参数,简化打印过程
    2025-07-07
  • Java 自定义Spring框架以及Spring框架的基本使用

    Java 自定义Spring框架以及Spring框架的基本使用

    Spring框架是由于软件开发的复杂性而创建的。Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅仅限于服务器端的开发
    2021-10-10
  • Springboot Mybatis使用pageHelper如何实现分页查询

    Springboot Mybatis使用pageHelper如何实现分页查询

    这篇文章主要介绍了Springboot Mybatis使用pageHelper如何实现分页查询问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • Java lastIndexOf类使用方法原理解析

    Java lastIndexOf类使用方法原理解析

    这篇文章主要介绍了Java lastIndexOf类使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • Java实现双向链表(两个版本)

    Java实现双向链表(两个版本)

    这篇文章主要介绍了Java实现双向链表(两个版本)的相关资料,需要的朋友可以参考下
    2016-02-02
  • SpringBoot添加License的多种方式

    SpringBoot添加License的多种方式

    License指的是版权许可证,当我们开发完系统后,如果不想让用户一直白嫖使用,比如说按时间续费,License的作用就有了。我们可以给系统指定License的有效期,控制系统的可用时间。
    2021-06-06
  • Java使用try-with-resources实现自动解锁

    Java使用try-with-resources实现自动解锁

    项目中使用Redission分布式锁,每次使用都需要显示的解锁,很麻烦,Java 提供了 try-with-resources 语法糖,它不仅可以用于自动关闭流资源,还可以用于实现自动解锁,本文将介绍如何利用 try-with-resources 实现锁的自动释放,需要的朋友可以参考下
    2025-01-01
  • 深入理解Java高级特性——注解

    深入理解Java高级特性——注解

    这篇文章主要介绍了Java高级特性——注解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • 详解Java线程池是如何重复利用空闲线程的

    详解Java线程池是如何重复利用空闲线程的

    在Java开发中,经常需要创建线程去执行一些任务,实现起来也非常方便,此时,我们很自然会想到使用线程池来解决这个问题,文中给大家提到使用线程池的好处,对Java线程池空闲线程知识感兴趣的朋友一起看看吧
    2021-06-06

最新评论