学科分类
目录
Spring Boot开发

Security管理前端页面

在前面几个小节中,我们只是通过Spring Security对后台增加了权限控制,前端页面并没有做任何处理,前端页面显示的还是对应的链接等内容,用户体验较差。接下来,在前面案例的基础上,讲解如何使用Security与Thymeleaf整合实现前端页面的管理。

1.添加thymeleaf-extras-springsecurity5依赖启动器

在项目pom.xml中添加thymeleaf-extras-springsecurity5依赖启动器,示例代码如下:

<dependency>
    <groupId>org.thymeleaf.extras</groupId>
    <artifactId>thymeleaf-extras-springsecurity5</artifactId>
</dependency>

需要注意的是,上述添加的thymeleaf-extras-springsecurity5依赖启动器中,其版本号同样是由Spring Boot统一整合并管理的。如果引用thymeleaf-extras-springsecurity4依赖启动器,那么还需要添加<version>标签手动进行版本管理。

2.修改前端页面,使用Security相关标签进行页面控制

打开chapter07项目首页index.html,引入Security安全标签,并在页面中根据需要使用Security标签进行显示控制,修改后的项目首页内容如文件1所示。

文件1 Index.html

 1    <!DOCTYPE html>
 2    <html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" 
 3           xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity5">
 4    <head>
 5        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 6        <title>影视直播厅</title>
 7    </head>
 8    <body>
 9    <h1 align="center">欢迎进入电影网站首页</h1>
 10    <div sec:authorize="isAnonymous()">
 11        <h2 align="center">游客您好,如果想查看电影<a th:href="@{/userLogin}">请登录</a></h2>
 12    </div>
 13    <div sec:authorize="isAuthenticated()">
 14        <h2 align="center"><span sec:authentication="name" style="color: #007bff"></span>
 15        您好,您的用户权限为<span sec:authentication="principal.authorities"
 16                             style="color:darkkhaki"></span>,您有权观看以下电影</h2>
 17        <form th:action="@{/mylogout}" method="post">
 18            <input th:type="submit" th:value="注销" />
 19        </form>
 20    </div>
 21    <hr>
 22    <div sec:authorize="hasRole('common')">
 23        <h3>普通电影</h3>
 24        <ul>
 25            <li><a th:href="@{/detail/common/1}">我不是药神</a></li>
 26            <li><a th:href="@{/detail/common/2}">夏洛特烦恼</a></li>
 27        </ul>
 28    </div>
 29    <div sec:authorize="hasAuthority('ROLE_vip')">
 30        <h3>VIP专享</h3>
 31        <ul>
 32            <li><a th:href="@{/detail/vip/1}">速度与激情</a></li>
 33            <li><a th:href="@{/detail/vip/2}">猩球崛起</a></li>
 34        </ul>
 35    </div>
 36    </body>
 37    </html>

文件1中,页面顶部通过“xmlns:sec”引入了Security安全标签,页面中根据需要编写了4个<div>模块。下面,针对这4个<div>模块作用及内部属性进行详细说明,具体如下所示。

(1)第10-12行代码使用sec:authorize="isAnonymous()"属性判断用户是否未登录,只有匿名用户(未登录用户)才会显示“请登录”链接提示。

(2)第13-20行代码使用sec:authorize="isAuthenticated()"属性来判断用户是否已登录,只有认证用户(登录用户)才会显示登录用户信息和注销链接等提示。

(3)第22-28行代码使用sec:authorize="hasRole('common')"属性,定义了只有角色为common(对应权限Authority为ROLE_common)且登录的用户才会显示普通电影列表信息。

(4)第29-35行代码使用sec:authorize="hasAuthority('ROLE_vip')"属性,定义了只有权限为ROLE_vip(对应角色Role为vip)且登录的用户才会显示VIP电影列表信息。

另外,在第14-16行代码进行登录用户信息获取展示时,使用sec:authentication="name"和sec:authentication="principal.authorities"两个属性分别显示了登录用户名name和权限authority。

3.效果测试

重启chapter07项目进行效果测试,项目启动成功后,通过浏览器访问“http://localhost:8080/”查看项目首页,效果如图1所示。

图1 访问项目首页效果

从图1可以看出,此次访问项目首页时,页面上方出现提示“请登录”的链接,页面中不再展示普通电影和VIP电影列表了,说明页面安全访问控制初显成效。接着,单击“请登录”链接跳转到项目登录页面,输入正确的用户名和密码进行登录,登录成功后会跳转到项目首页,效果如图2所示。

图2 访问项目首页效果

不同权限的用户登录后,电影网站首页会显示出用户的权限信息以及可以查看的影片信息,这与前面页面中的控制效果一致,说明在Thymeleaf页面使用的Security安全标签成功实现了页面的安全访问控制。

点击此处
隐藏目录