Thymeleaf的sec:authorize标签可以在前端做权限控制,根据用户角色显示不同的内容。用法十分简单,和th:if类似。

<div sec:authorize="isAuthenticated()">
    <p>已登录</p>
</div>
<div sec:authorize="hasRole('ROLE_ADMIN')">
    <p>管理员</p>
</div>
<div sec:authorize="hasRole('ROLE_USER')">
    <p>普通用户</p>
</div>

使用它必须使用SpringSecurityThymeleaf模板引擎 , 有两件非常重要的事情需要做:

  • 在html中引入相关的命名空间
  • <html xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity5">
  • 在pom文件中添加thymeleaf-extras-springsecurity依赖
  •         <dependency>
                <groupId>org.thymeleaf.extras</groupId>
                <artifactId>thymeleaf-extras-springsecurity5</artifactId>
            </dependency>

    然而有很大概率是你做完上面两件事情之后,sec:authorize并没有生效。问题出在thymeleaf-extras-springsecurity的版本号上

    要依赖SpringSecurityThymeleaf,因此它的版本号必须和这两个库匹配,thymeleaf-extras-springsecurity本身就有以下三个版本

    1. thymeleaf-extras-springsecurity3
    2. thymeleaf-extras-springsecurity4
    3. thymeleaf-extras-springsecurity5

    分别对应SpringSecurity的三个版本

    1. springsccurity3
    2. springsccurity4
    3. springsccurity5

    这三个版本中又分别有2.x3.x版本对应Thymeleaf2.x3.x版本,任意一个版本对不上,sec:authorize标签都不会生效。

    关于版本号的问题,在thymeleaf-extras-springsecurity项目的GitHub上给出了明确的说明。

    在html中引入命名空间的时候,也需要指定一个版本的thymeleaf-extras-springsecurity,最好是和项目依赖中的相同。

    如果你在接手一个老项目,又发现sec:authorize无效,查看一下你的SpringSecurityThymeleaf的版本号,是否和thymeleaf-extras-springsecurity的版本号匹配。

    最后修改日期:2020-01-15

    作者

    留言

    撰写回覆或留言

    发布留言必须填写的电子邮件地址不会公开。