@RequiresPermissions 生效

本文深入探讨了Apache Shiro框架中@RequiresPermissions注解的工作原理。通过源码解析,展示了该注解如何实现不同逻辑(AND、OR)下的权限验证过程。针对单一权限和多个权限的不同场景,提供了详细的实现步骤。

@RequiresPermissions 生效

org.apache.shiro.authz.aopPermissionAnnotationHandler


    public void assertAuthorized(Annotation a) throws AuthorizationException {
        if (!(a instanceof RequiresPermissions)) return;

        RequiresPermissions rpAnnotation = (RequiresPermissions) a;
        String[] perms = getAnnotationValue(a);
        Subject subject = getSubject();

        if (perms.length == 1) {
            subject.checkPermission(perms[0]);
            return;
        }
        if (Logical.AND.equals(rpAnnotation.logical())) {
            getSubject().checkPermissions(perms);
            return;
        }
        if (Logical.OR.equals(rpAnnotation.logical())) {
            // Avoid processing exceptions unnecessarily - "delay" throwing the exception by calling hasRole first
            boolean hasAtLeastOnePermission = false;
            for (String permission : perms) if (getSubject().isPermitted(permission)) hasAtLeastOnePermission = true;
            // Cause the exception if none of the role match, note that the exception message will be a bit misleading
            if (!hasAtLeastOnePermission) getSubject().checkPermission(perms[0]);
            
        }
    }

    protected String[] getAnnotationValue(Annotation a) {
        RequiresPermissions rpAnnotation = (RequiresPermissions) a;
        return rpAnnotation.value();
    }

### 使用 `@RequiresPermissions` 注解添加权限控制 #### 方法签名中的应用 为了在控制器层的方法上添加权限控制,可以在方法声明前加上 `@RequiresPermissions` 注解并指定所需的权限字符串。例如,在一个名为 `testMethod()` 的函数上方可以这样配置: ```java @RequiresPermissions({"sys:user:add"}) void testMethod(); ``` 此设置意味着调用该方法时,系统会检查当前用户是否拥有 `"sys:user:add"` 这项权限[^1]。 #### 处理多个权限需求 当需要验证多种不同类型的权限时,可以通过传递数组给 `value` 参数来实现多条件判断,并通过设定 `logical` 属性为 `Logical.AND` 或者 `Logical.OR` 来决定逻辑关系是“与”还是“或”。下面的例子展示了如何组合四个不同的下载操作权限进行授权: ```java @RequiresPermissions( value = { "engineeringPause:download", "workContact:download", "supervisionNotice:download", "questionNotification:download" }, logical = Logical.OR ) ``` 这里表示只要满足任意一项列出的操作即可获得访问许可;如果改为 `Logical.AND` 则需全部匹配成功才行[^4]。 #### 解决可能遇到的问题 有时可能会发现即使正确设置了注解也未能生效的情况。这可能是由于 Shiro 配置不当所致。确保已适当初始化 Realm 并注册到 SecurityManager 中,同时确认已经开启了相应的全局安全拦截器支持以便识别这些注解。另外需要注意的是,权限字符串应当精确对应于实际存储在数据库或其他持久化介质里的那些值——比如上面提到的案例中,应该严格按照 `"system:user:add"` 而不是仅使用部分路径如 `"system"` 或 `"system:user"` 去做比较[^2]。 对于某些框架版本兼容性问题或是其他潜在错误,建议查阅官方文档获取最新指导说明以及查看社区反馈寻找解决方案[^5]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值