最近一个后台管理系统需要实现权限控制,采用了springboot(项目框架) + shiro(权限框架)进行框架整合。
Shiro作为Apache下的一款轻量权限框架,和Springboot的整合还是比较容易的,进行页面级的权限控制也是水到渠成的事情,不细讲。本篇文章主要讲讲 Springboot+shiro再整合thymeleaf进行页面按钮级控制。
1、maven 依赖引入:
<!-- 只展示shiro相关依赖 -->
// 1
<properties>
<thymeleaf.version>3.0.3.RELEASE</thymeleaf.version>
<thymeleaf-layout-dialect.version>2.2.0</thymeleaf-layout-dialect.version>
</properties>
// 2
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.14.RELEASE</version>
</parent>
// 3
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
// 4
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>1.3.2</version>
</dependency>
// 5 必须加上
<dependency>
<groupId>com.github.theborakompanioni</groupId>
<artifactId>thymeleaf-extras-shiro</artifactId>
<version>2.0.0</version>
</dependency>
以上是正确的依赖引入。
注意点 1,因为一些历史遗留问题吧,我这引入的Springboot版本是1.5.14.RELEASE。其实单独拿出来也没啥问题,但如果和shiro + thymeleaf整合就可能有版本问题。
我们都知道Springboot 2.0以下的springboot版本默认整合的thymeleaf版本是 2.x版本的,也就是上面 pom.xml 里面 数字3 的位置处,spring-boot-starter-thymeleaf 的 version 虽然没写(写了好像也会报错),但其实是2.x。
大家可能会对 数字1 处 properties 标签里的两行代码有疑问,因为它们看上去没被用到啊。可以先将它们去掉,于是。。。就报错了:
org.thymeleaf.dialect.AbstractProcessorDialect 没找到,这是因为 thymeleaf 2.x 版本不存在 这个类。所以,需要加上 数字 1 处的两个设置:
(1)把 thymeleaf 设置为 3.x 版本
(2)把 页面上需要用到的用来控制权限的 shiro标签(类似于JSTL的c标签) 设置为 2.x 版本,如果没有这一句也会报错:
注意点 2,引入的 thymeleaf-extras-shiro 依赖 需要是 2.x 版本的,否则,就像我刚开始写的 1.2.2 版本一样,会报错:
OK,经过上面BUG的洗礼之后,项目成功启动啦!该干点正事了。
首先,如果需要在页面上使用 shiro 的标签 进行权限控制,需要在 shiro 的配置类里注入 ShiroDialect 类(重要),这个类是thymeleaf-extras-shiro.jar 里面的:
@Configuration
public class ShiroConfig {
...
@Bean(name = "shiroDialect")
public ShiroDialect shiroDialect(){
return new ShiroDialect();
}
}
然后,在需要使用 shiro 标签的页面上引入 shiro标签,如下:
<html xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
不知道为啥,我没引这个好像也不报错。Anyway,还是加上比较保险。
最后,就可以在你页面需要进行权限控制的 html标签上 加上 shiro标签啦,如下:
<a href="javascript" shiro:user="" >欢迎 <shiro:principal /></li>
<a href="javascript" shiro:hasPermission="admin:delete" >删除</a>
<button href="javascript:;" shiro:hasRole="admin">编辑</button>
上面的例子只用了部分标签,其实还有很多:
<shiro:principal /> // 当前用户的登录信息,用户名之类
shiro:guest="" // 验证是否是游客,即未认证的用户
shiro:user="" // 验证是否是已认证或已记住用户
shiro:authenticated="" // 验证是否是已认证用户,不包括已记住用户
shiro:notAuthenticated= "" // 未认证用户,但是 已记住用户
shiro:lacksRole="admin" // 表示没有 admin 角色的用户
shiro:hasAllRoles="admin, user1" // 表示需要同时拥有两种角色
shiro:hasAnyRoles="admin, user1" // 表示 拥有其中一个角色即可
shiro:lacksPermission="admin:delete" // 类似于 shiro:lacksRole
shiro:hasAllPermissions="admin:delete, admin:edit" // 类似于 shiro:hasAllRoles
shiro:hasAnyPermission="admin:delete, admin:edit" // 类似于 hasAnyRoles
THE END!
以上为个人学习总结,如有问题文明吐槽。