<shiro:hasPermission>标签多个权限判断

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了<shiro:hasPermission>标签多个权限判断相关的知识,希望对你有一定的参考价值。

想问一下,怎么可以控制操作这一列在具备role:right或者role:modify权限时可以显示,若两种权限都不具备则不显示这一列?

我想过这样做,但这种想法行不通,直接报错了,连页面都出不来:
<shiro:hasPermission name="role:right , role:modify">
<a class="btn btn-success btn-sm" role="button"
href="$ctx/role/toRight?id=$role.id">设置权限</a>
<a class="btn btn-warning btn-sm" role="button"
href="$ctx/role/toModify?id=$role.id">修改</a>
</shiro:hasPermission>

这样的做法能加载页面,但是里面的按钮不显示了。
<shiro:hasPermission name="role:right">
<shiro:hasPermission name="role:modify">
<a class="btn btn-success btn-sm" role="button"
href="$ctx/role/toRight?id=$role.id">设置权限</a>
<a class="btn btn-warning btn-sm" role="button"
href="$ctx/role/toModify?id=$role.id">修改</a>
</shiro:hasPermission>
</shiro:hasPermission>

以下是表格源代码:
<table>
<tr class="th_sty">
....
<td nowrap="nowrap" width="20%">操作</td>
</tr>

<%-- 迭代列表 --%>
<c:forEach items="$page.list" var="role">
<tr>
...
<td>
<shiro:hasPermission name="role:right">
<a class="btn btn-success btn-sm" role="button"
href="$ctx/role/toRight?id=$role.id">设置权限</a>
</shiro:hasPermission>

<shiro:hasPermission name="role:modify">
<a class="btn btn-warning btn-sm" role="button"
href="$ctx/role/toModify?id=$role.id">修改</a>
</shiro:hasPermission>
</td>
</tr>
</c:forEach>

</table>

逗号分割。

推荐一套完整的Shiro Demo,免费的。

Shiro介绍文档:http://www.sojson.com/shiro
Demo已经部署到线上,地址是http://shiro.itboy.net

管理员帐号:admin,密码:sojson.com 如果密码错误,请用sojson。PS:你可以注册自己的帐号,然后用管理员赋权限给你自己的帐号,但是,每20分钟会把数据初始化一次。建议自己下载源码,让Demo跑起来,然后跑的更快。

参考技术A The hasAllPermissions tag
<p shiro:hasAllPermissions="user:create, user:delete">
You can create and delete users.
</p>本回答被提问者采纳
参考技术B 这个问题你解决了吗?

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

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>

以上是关于<shiro:hasPermission>标签多个权限判断的主要内容,如果未能解决你的问题,请参考以下文章

<g:applyLayout /> 和 <g:render template /> 有啥区别

如何设置 SVG <g> 元素的样式?

Grails GSP <g:set> 标签设置为整数?

算法训练

是否可以通过单击 <g> 来选择 <path>?

每个 <g> 的 CSS 动画“原点”