shiro-重写标签功能----shiro:hasPermission 标签重写

该博客主要介绍如何重写Shiro的hasPermission标签,以实现更复杂的权限控制功能,例如处理`modular:to_edit or modular:delete`等多权限逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

public abstract class ShiroAuthorizingRealm extends AuthorizingRealm{

    private static final String OR_OPERATOR = " or ";  
    private static final String AND_OPERATOR = " and ";  
    private static final String NOT_OPERATOR = "not ";

    @Override
    public boolean isPermitted(PrincipalCollection principals, String permission) {
        /*理解问题:传递过来的字符串的格式:
            或者格式 : 权限1 or 权限2
            与格式:      权限1 and 权限2
           非格式:       not 权限1 
          */
        
        //步骤:通过判断来实现三种操作符
        if (permission.contains(OR_OPERATOR)) {
            //如果有任何一个权限,返回true,否则返回false
            String[] permissions = permission.split(OR_OPERATOR);
            for (String p : permissions) {
                //只要有一个权限是通过验证的就返回true
                if (this.isPermittedWithNotOperator(principals, p)) {
                    return true;
                }
            }
            return false;
            
        }else if (permission.equals(AND_OPERATOR)) {
            //必须两个权限都有,返回true.否则返回false
            String[] permissions = permission.split(AND_OPERATOR);
            for (String p : permissions) {
                //只要有一个权限是false的,我们就返回假
                if (this.isPermittedWithNotOperator(principals, p)==false) {
                    return false;
                }
            }
            return true;
            
        }else {
            //如果没有关键字,按正常方式执行
            return this.isPermittedWithNotOperator(principals, permission);
        }
        

        
    }
    
    private boolean isPermittedWithNotOperator(PrincipalCollection principals, String permission) {  
        //判断权限字符串前缀是否有"not "关键字。
        if(permission.startsWith(NOT_OPERATOR)) {  
            //如果有,就返回相反的结构
            return !super.isPermitted(principals, permission.substring(NOT_OPERATOR.length()));  
        } else {  
            return super.isPermitted(principals, permission); 
           
        }  
    }  
}

<shiro:hasPermission name="modular:to_edit or modular:delete">
                                                    
 </shiro:hasPermission>

 

<shiro:hasPermission name="modular:to_edit or modular:delete">
                                                    
 </shiro:hasPermission>

 

 

<shiro:hasPermission name="modular:to_edit or modular:delete">
                                                    
 </shiro:hasPermission>

转载于:https://www.cnblogs.com/vieta/p/11139765.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值