Shiro 整合 Thymeleaf
1. springboot 与 shiro 的整合
https://blog.csdn.net/qq_30815637/article/details/97823385
2. 加入 maven 的依赖
thymeleaf-extras-shiro : 一个关于 shiro 标签的 Thymeleaf 方言 .
Maven pom 方式
<dependency>
<groupId>com.github.theborakompanioni</groupId>
<artifactId>thymeleaf-extras-shiro</artifactId>
<version>${thymeleaf-shiro.version}</version>
</dependency>
Jar 包方式
Download 从maven仓库
git 地址
git clone https://github.com/theborakompanioni/thymeleaf-extras-shiro.git
3. 在 ShiroConfig 中配置 shiro 标签
//*** 千万别忘了加 bean , 否则页面无法正常的显示权限 !!! ***//
@Bean
public ShiroDialect shiroDialect(){
return new ShiroDialect();
}
4. 页面中使用
现在页面上加入 :
<html xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
使用 shiro 的标签
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org"
xmlns:shiro="http://www.pollix.at/thymeleaf/shiro" >
<head>
<meta charset="UTF-8">
<title>首页</title>
</head>
<body>
<!-- 取出主体的用户名 -->
<p>[[${user.username}]],您好.</p>
</body>
</html>
5. shiro 标签
可以参考 : http://shiro.apache.org/web.html#Web-usertag
<!-- guest 标签 -->
<!--
guest仅当当前Subject被视为“访客”时,标签才会显示其包装内容.
也就是说,没有登录的用户或者没有使用记住我的用户访问才会显示.
-->
<shiro:guest>
Hi there! Please <a href="login.jsp">Login</a>
</shiro:guest>
<!-- user 标签 -->
<!--
user仅当当前Subject被视为“用户”时,标签才会显示其包装内容.
已经登录的用户或者使用“RememberMe”服务记住的用户.
-->
<shiro:user>
Welcome back John! Not John? Click <a href="login.jsp">here<a> to login.
</shiro:user>
<!-- authenticated 标签 -->
<!--
仅在当前用户在其当前会话期间成功通过身份验证时才显示正文内容。
它比'user'标签更具限制性。它在逻辑上与'notAuthenticated'标签相反。
authenticated仅当当前会话期间当前Subject已成功验证时,
标记才会显示其包装内容。它是一个比用户更严格的标签,用于保证敏感工作流程中的身份。
与 user 标签不同的是, 该标签不能为“RememberMe”服务记住的用户.
该authenticated标签是的逻辑相反的notAuthenticated标签。
-->
<shiro:authenticated>
<a href="updateAccount.jsp">Update your contact information</a>.
</shiro:authenticated>
<!-- notAuthenticated 标签 -->
<!--
与 Authenticated 标签相反
-->
<shiro:notAuthenticated>
Please <a href="login.jsp">login</a> in order to update your credit card information.
</shiro:notAuthenticated>
<!-- principal 标签 -->
<!--
该principal标签将输出Subject的principal(识别属性),或主要的属性。
如果没有任何标记属性,标记将呈现toString()主体的值。例如(假设主体是String用户名):
-->
Hello, <shiro:principal/>, how are you today?
<!-- 这(大部分)等同于以下内容:-->
Hello, <%= SecurityUtils.getSubject().getPrincipal().toString() %>, how are you today?
<!--
principal标签假定默认情况下,打印的是subject.getPrincipal()的值。
但是,如果您想要打印一个不是主要主体的值,而是打印在主体的主要集合中另一个值,
则可以按类型获取该主体并打印该值。
-->
<!-- 例如,假设ID在主要集合中,打印主题的用户ID(而不是用户名):-->
User ID: <principal type="java.lang.Integer"/>
<!-- 这(大部分)等同于以下内容:-->
User ID:
<%= SecurityUtils.getSubject().getPrincipals().oneByType(Integer.class).toString()
%>
<!-- 获取 principle 的属性 -->
<!--
如果主体(上面的默认主要主体或“类型”主体)是复杂对象而不是简单字符串,
并且您想引用该主体上的属性,可以使用该property属性指示要读取的属性的名称
(必须要配合JavaBeans的getter方法访问)。例如(假设主要主体是User对象):
-->
Hello, <shiro:principal property="firstName"/>, how are you today?
<!-- 或者,与type属性结合使用: -->
Hello, <shiro:principal type="com.foo.User" property="firstName"/>, how are you today?
<!-- 这大致等同于以下内容: -->
Hello,
<%= SecurityUtils.getSubject().getPrincipals().oneByType(com.foo.User.class).getFirstName().toString()
%>, how are you today?
<!-- hasRole 标签 -->
<!-- 取出主体的角色信息 如果拥有该角色, 则进行显示 -->
<p shiro:hasRole="vip">你的角色为Vip用户</p>
<!-- lacksRole标签 -->
<!-- 该lacksRole标签将显示内容仅当如果当前Subject没有分配指定的角色 -->
<shiro:lacksRole name="administrator">
Sorry, you are not allowed to administer the system.
</shiro:lacksRole>
<!-- hasAnyRole标签 -->
<!--
该hasAnyRole如果当前标签会显示它的包裹内容Subject被分配任何指定的角色从一个逗号分隔的角色名称 列表
-->
<shiro:hasAnyRoles name="developer, project manager, administrator">
You are either a developer, project manager, or administrator.
</shiro:hasAnyRoles>
<!-- hasPermission 标签 -->
<!-- 判断是否拥有某个权限 如果有,则显示, 如果没有则不显示 -->
<a shiro:hasPermission="user:query" >您有查询用户的权限</a>
<!-- lacksPermission标签 -->
<!--
lacksPermission仅当当前Subject DOES没有(暗示)指定的权限时,
标记才会显示其包装内容。也就是说,用户没有指定的能力。
-->
<shiro:lacksPermission name="user:delete">
Sorry, you are not allowed to delete user accounts.
</shiro:lacksPermission>