使用shiro标签遇到的坑

1、前言

使用shiro框架做权限控制是不错的选择,在使用shiro标签的过程中,是否会遇到一些坑呢。恰好笔者遇到了,在此记录一下。

2、shiro标签坑的描述

标签:

<shiro:haspermission name="你的权限"></shiro:haspermission>

当使用的标签具有层级关系的时候,就有可能掉坑里,并且出不来。

例如:

第一层级权限为:【dealer:clue】,第二层级为:【dealer:clue:add】,这个使用坑就出现了。当你使用【dealer:clue:add】权限,关闭【dealer:clue】权限时,你会发现然并卵。

查了很多资料,有人说shiro标签具有继承关系,其实不是的。是因为shiro框的判断机制引起的。我们来一起看看源码吧。

3、源码追踪

标签调用后台的方法:

核心方法:

protected List<Set<String>> getParts() {
    return this.parts;
}

public boolean implies(Permission p) {
    if (!(p instanceof WildcardPermission)) {
	return false;
    } else {
        WildcardPermission wp = (WildcardPermission) p;
        // 将权限标识转化成set集合
        List otherParts = wp.getParts();
        int i = 0;

        for (Iterator part = otherParts.iterator(); part.hasNext(); ++i) {
	    Set otherPart = (Set) part.next();
	    if (this.getParts().size() - 1 < i) {
	        return true;
	    }

	    Set part1 = (Set) this.getParts().get(i);
            // 判断包含关系【dealer:clue:add】与【dealer:clue】
	    if (!part1.contains("*") && !part1.containsAll(otherPart)) {
	    	return false;
	    }
        }

        while (i < this.getParts().size()) {
	    Set arg7 = (Set) this.getParts().get(i);
	    if (!arg7.contains("*")) {
	        return false;
	    }

	    ++i;
        }

        return true;
    }
}

4、总结

综上所述,有层级关系的权限标识就有可能带来使用的误区。

shiro标签的判断方式是通过集合的包含关系判断的,并不是通过字符串的形式。

5、参考文档

https://blog.csdn.net/bubble21/article/details/78829959

### Shiro 框架中 JSP 标签使用方法 #### 1. **引入 Shiro 标签库** 在 JSP 页面中使用 Shiro 提供的标签之前,需要先引入 Shiro标签库。通过以下代码声明标签库: ```jsp <%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags" %> ``` 此语句的作用是告诉 JSP 引擎加载 Shiro 的自定义标签库,并为其设置前缀 `shiro`[^1]。 #### 2. **常用 Shiro 标签及其功能** ##### (1)`<shiro:hasRole>` 标签 用于检测当前用户是否拥有指定的角色。如果有,则显示标签体内的内容;如果没有,则忽略。 ```jsp <shiro:hasRole name="admin"> <!-- 如果用户有 admin 角色 --> <button>删除</button> </shiro:hasRole> ``` 当页面渲染时,Shiro 自动调用 `doGetAuthorizationInfo` 方法获取用户的授权信息,并据此决定是否渲染按钮[^3]。 ##### (2)`<shiro:lacksRole>` 标签 与 `<shiro:hasRole>` 相反,用于检测当前用户是否缺少指定角色。 ```jsp <shiro:lacksRole name="admin"> <!-- 如果用户没有 admin 角色 --> <p>您无权访问此功能。</p> </shiro:lacksRole> ``` ##### (3)`<shiro:hasPermission>` 标签 用于检测当前用户是否具备某种权限。 ```jsp <shiro:hasPermission name="user:create"> <!-- 如果用户有 user:create 权限 --> <a href="/createUser">创建用户</a> </shiro:hasPermission> ``` ##### (4)`<shiro:lacksPermission>` 标签 与 `<shiro:hasPermission>` 相反,用于检测当前用户是否缺乏某种权限。 ```jsp <shiro:lacksPermission name="user:create"> <!-- 如果用户没有 user:create 权限 --> <p>您无法创建新用户。</p> </shiro:lacksPermission> ``` ##### (5)`<shiro:user>` 和 `<shiro:guest>` - `<shiro:user>`:仅当用户已登录时才显示其内部的内容。 - `<shiro:guest>`:仅当用户未登录时才显示其内部的内容。 ```jsp <shiro:user> <p>欢迎您,<shiro:principal /></p> </shiro:user> <shiro:guest> <p>请<a href="/login">登录</a>以继续。</p> </shiro:guest> ``` #### 3. **注意事项** - 在使用 Shiro 标签时,需确保项目中已经正确配置了 ShiroFilter 并启用了相应的过滤规则[^5]。 - 若页面中有多个 Shiro 标签,每次都会触发 `doGetAuthorizationInfo` 方法来验证权限。因此,在实际开发中应优化该方法的性能,例如加入缓存机制[^3]。 --- ### 示例代码展示 以下是一个综合使用的示例: ```jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags" %> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Shiro JSP 标签示例</title> </head> <body> <h1>欢迎来到管理系统</h1> <shiro:user> <p>您好:<shiro:principal /></p> </shiro:user> <shiro:guest> <p><a href="/login">点击此处登录</a></p> </shiro:guest> <hr /> <shiro:hasRole name="admin"> <button onclick="location.href='/delete'">删除记录</button> </shiro:hasRole> <shiro:hasPermission name="user:create"> <a href="/createUser">创建新用户</a> </shiro:hasPermission> <shiro:lacksPermission name="user:create"> <p>抱歉,您没有权限创建新用户。</p> </shiro:lacksPermission> </body> </html> ``` --- ### 总结 Shiro 提供了一套简单易用的 JSP 标签库,能够方便地实现界面级别的权限控制。通过这些标签,开发者可以在前端层面屏蔽掉未经授权的操作入口,从而提升用户体验的同时也增强了系统的安全性[^1]。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

智_永无止境

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值