第九节 Shiro标签原理分析

x33g5p2x  于2021-12-18 转载在 其他  
字(2.9k)|赞(0)|评价(0)|浏览(321)

一、shiro的标签

      首先,你需要知道的是,标签的实质其实是Java代码。你已经知道,JSP实质也是Java代码,更别说用在JSP中的标签了。 稍后你会在源码追踪环节了解到:Shiro标签执行了哪些Java代码。

      标签的作用就是移除JSP页面中的Java代码。

      OK,下面进入正题:Shiro标签。

      最常见的Shiro标签有三个
shiro: principal 标签。获取当前用户认证主凭证信息。支持主凭证是一个对象,可用property的方式取出。

shiro: hasRole  标签。判断当前登录用户是否拥有某种角色。

shiro: hasPermission  判断当前用户是否拥有某种权限。

二、使用实例

        本章节项目源码:点击我下载源码

        我们继续使用上一小节的WEB环境。你可以返回上一小节,复制我的代码,制作一个基本的Shiro与WEB集成环境。

        接着,我们在main.jsp页面里面使用shiro标签。

        首先展示的是shiro.ini配置文件。用户jay =123456 拥有coder角色,并且拥有code:insert与code:update权限。

[main]
#若没有登录,则被authc拦截器重定向到login.jsp页面
logout.redirectUrl=/login.jsp
#用户退出后跳转指定JSP页面
authc.loginUrl = /login.jsp
[users]
jay = 123456,coder
[roles]
coder = code:insert,code:update
[urls]
#发送main请求需要经过认证拦截器authc
#如果用户没有登录,则重定向到login.jsp页面
/main.jsp = authc
#退出拦截器,注销当前用户
/logout = logout

        接下来编写main.jsp页面。进入main.jsp页面的条件就是用户jay已经登录。main.jsp页面的代码如下。

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>这里是main.jsp,欢迎来到shiro的世界</h1>
<h1>欢迎用户<shiro:principal/>登录</h1>

<shiro:hasRole name="coder">
    <h1> 能看到我代表你有程序员coder角色</h1>
</shiro:hasRole>

<shiro:hasPermission name="code:insert">
    <button>提交代码</button><br>
</shiro:hasPermission>
<shiro:hasPermission name="code:update">
    <button>更新代码</button>
</shiro:hasPermission>
<shiro:hasPermission name="code:delete">
    <button>删除代码</button>
</shiro:hasPermission>

</body>
</html>

      首先在浏览器上输入http://localhost:8080/main.jsp 。因为没有登录,所以请求会被重定向为http://localhost:8080/login.jsp

      接着,点击第一个超链接"发送登录认证请求",登陆成功。

      登录成功后,再次请求受限制页面http://localhost:8080/main.jsp。成功来到main.jsp页面。

      我在登录后,并请求main.jsp页面 ,页面上的效果如图所示。(页面丑,求轻喷,大宇的前端水平是helloworld级别的)

      OK,页面的话弄的是惨不忍睹,对比main.jsp页面的源码,最基本的Shiro标签功能算是展示出来了。

      JSP中的"欢迎用户shiro:principal/登录"的代码,已经被shiro标签成功解析。在页面上将shiro:principal/解析为了shiro.ini配置文件中的jay。

      用户jay是coder角色,并且拥有 code:insert权限与code:update权限,所以可以看到"提交代码按钮"与"更新代码按钮"。

      因为jay没有code:delete权限,所以"删除代码按钮"没有在页面上显示出来。

      好了,让我们不要在纠结页面太丑这个问题了。接下来,让我们进入源码,看看Shiro标签到底做了什么事情。

三、源码追踪

shiro:principal/源码追踪。

       首先,我们在main.jsp页面上找到shiro:principal/标签,按住CRTL点开它的源码配置。

      哦,原来处理此标签的类是一个叫org.apache.shiro.web.tags.PrincipalTag的类。我们继续追踪到此类,在onDoStartTag这个方法处打个断点。

      刷新我们的main.jsp页面,让其重新执行一次解析标签的逻辑。因此,代码就执行到了我们的断点处。研究一下代码,一下就明白了。原来就是获取门面对象Subject对象,拿到Subject对象里面的主凭证。如果主凭证可能是一个对象,比如user对象,将其  地址address 属性作为主凭证,那么可以这样配置:<shiro:principal  property="address"/>。

      最后,将数据刷新到JSP页面中。是不是很简单,原来源码也不是想象中的那么恐怖,不是吗。

shiro:hasRole/源码追踪。

      获取到当前Shiro环境的Subject对象,再判断当前登录用户是否有此角色。

      返回1则页面显示,返回0则页面不显示。

shiro:hasPerssion/源码追踪。

四、如何开发自定义标签

      自定义标签其实不难,开发出自己的标签也是一个非常有趣的过程。如果你有业务需要,或者想进一步学习如何开发标签,欢迎参考:“孤傲苍狼”大牛的jsp自定义标签开发入门

五、源码下载

      本章节项目源码:点击我下载源码

相关文章