springboot + shiro + thymeleaf 实现按钮级权限控制 踩坑合集

最近一个后台管理系统需要实现权限控制,采用了springboot(项目框架) + shiro(权限框架)进行框架整合。

Shiro作为Apache下的一款轻量权限框架,和Springboot的整合还是比较容易的,进行页面级的权限控制也是水到渠成的事情,不细讲。本篇文章主要讲讲 Springboot+shiro再整合thymeleaf进行页面按钮级控制。

1、maven 依赖引入:


// 1

    3.0.3.RELEASE
    2.2.0


// 2

    org.springframework.boot
    spring-boot-starter-parent
    1.5.14.RELEASE


// 3

    org.springframework.boot
    spring-boot-starter-thymeleaf


// 4

    org.apache.shiro
    shiro-spring
    1.3.2


// 5 必须加上

    com.github.theborakompanioni
    thymeleaf-extras-shiro
    2.0.0

以上是正确的依赖引入。

注意点 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 标签里的两行代码有疑问,因为它们看上去没被用到啊。可以先将它们去掉,于是。。。就报错了:

springboot + shiro + thymeleaf 实现按钮级权限控制 踩坑合集_第1张图片

org.thymeleaf.dialect.AbstractProcessorDialect 没找到,这是因为 thymeleaf 2.x 版本不存在 这个类。所以,需要加上 数字 1 处的两个设置:

(1)把 thymeleaf 设置为 3.x 版本

(2)把 页面上需要用到的用来控制权限的 shiro标签(类似于JSTL的c标签) 设置为 2.x 版本,如果没有这一句也会报错:

springboot + shiro + thymeleaf 实现按钮级权限控制 踩坑合集_第2张图片

注意点 2,引入的 thymeleaf-extras-shiro 依赖 需要是 2.x 版本的,否则,就像我刚开始写的 1.2.2 版本一样,会报错:

springboot + shiro + thymeleaf 实现按钮级权限控制 踩坑合集_第3张图片

 

OK,经过上面BUG的洗礼之后,项目成功启动啦!该干点正事了。

首先,如果需要在页面上使用 shiro 的标签 进行权限控制,需要在 shiro 的配置类里注入 ShiroDialect 类(重要),这个类是thymeleaf-extras-shiro.jar 里面的:

@Configuration
public class ShiroConfig {

    ...

    @Bean(name = "shiroDialect")
    public ShiroDialect shiroDialect(){
        return new ShiroDialect();
    }

}

然后,在需要使用 shiro 标签的页面上引入 shiro标签,如下:

不知道为啥,我没引这个好像也不报错。Anyway,还是加上比较保险。

最后,就可以在你页面需要进行权限控制的 html标签上 加上 shiro标签啦,如下:

欢迎 
删除

上面的例子只用了部分标签,其实还有很多:

// 当前用户的登录信息,用户名之类

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!

以上为个人学习总结,如有问题文明吐槽。

你可能感兴趣的:(SpringBoot)