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 都无法拦截它。

总结

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

相关文章

  • java判断字符串String是否为空问题浅析

    java判断字符串String是否为空问题浅析

    这篇文章主要介绍了java判断字符串String是否为空问题,有需要的朋友可以参考一下
    2014-01-01
  • java编程枚举类型那些事!枚举类型定义和重写枚举的方法

    java编程枚举类型那些事!枚举类型定义和重写枚举的方法

    本文主要介绍了枚举类型的有关内容,涉及简单的枚举类型定义,以及枚举类型的值在Java中的定义方法,具有一定参考价值,需要的朋友可以了解下。
    2017-10-10
  • Java实现自动生成缩略图片

    Java实现自动生成缩略图片

    这篇文章主要为大家详细介绍了Java实现自动生成缩略图片,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • java 抽象类与接口的区别介绍

    java 抽象类与接口的区别介绍

    这篇文章主要介绍了java 抽象类与接口的区别介绍的相关资料,需要的朋友可以参考下
    2016-10-10
  • 详解Spring中的@PropertySource注解使用

    详解Spring中的@PropertySource注解使用

    这篇文章主要介绍了Spring的@PropertySource注解使用,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-08-08
  • Java踩坑记录之Arrays.AsList

    Java踩坑记录之Arrays.AsList

    这篇文章主要给大家介绍了关于Java踩坑记录之Arrays.AsList的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • SpringCloud的JPA连接PostgreSql的教程

    SpringCloud的JPA连接PostgreSql的教程

    这篇文章主要介绍了SpringCloud的JPA接入PostgreSql 教程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-06-06
  • 详解IDEA2021.2安装后的配置及重装问题

    详解IDEA2021.2安装后的配置及重装问题

    这篇文章主要介绍了IDEA2021.2安装后的配置及重装,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-08-08
  • Java UUID 五个版本的区别及使用场景小结

    Java UUID 五个版本的区别及使用场景小结

    在Java中,UUID是一个128位的唯一标识符,广泛应用于生成唯一标识符、分布式系统唯一键等场景,Java提供的java.util.UUID类支持五种UUID版本,每种具有不同的生成方式和使用场景,本文就来介绍一下如何使用,感兴趣的可以了解一下
    2024-11-11
  • PowerShell用户认证Function实例代码

    PowerShell用户认证Function实例代码

    这篇文章主要介绍了PowerShell用户认证Function的资料,并附实例代码,帮助大家学习理解,有需要的小伙伴可以参考下
    2016-09-09

最新评论