【Spring Security框架学习】权限控制 详解

Youzg LOGO

Maven依赖:

<!-- security-thymeleaf -->
<dependency>
    <groupId>org.thymeleaf.extras</groupId>
    <artifactId>thymeleaf-extras-springsecurity5</artifactId>
    <version>3.0.4.RELEASE</version>
</dependency>

命名空间 的导入:

xmlns:sec="http://www.thymeleaf.org/extras/spring-security"

thymeleaf 中的 相关方法 及 属性:

  1. 判断是否已登录
    未登录,则不显示拥有此属性的标签
sec:authorize="isAuthenticated()"
  1. 判断是否未登录
    已登录,则不显示拥有此属性的标签
sec:authorize="!isAuthenticated()"
  1. 判断是否拥有指定的权限
    不拥有,则不显示拥有此属性的标签:
sec:authorize="hasRole('指定权限名')"
  1. 判断是否不拥有指定的权限
    拥有,则不显示拥有此属性的标签:
sec:authorize="!hasRole('指定权限名')"
  1. 设置当前标签的内容用户名
sec:authentication="name"
  1. 设置当前标签的内容权限名
sec:authentication="authorities"

...
以上则是 权限控制常用属性及方法

那么,现在本人来展示下 权限控制 的使用:

使用展示:

目录结构:

目录结构 展示

首页代码:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org"
      xmlns:sec="http://www.thymeleaf.org/extras/spring-security">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
    <title>首页</title>
    <!--semantic-ui-->
    <link href="https://cdn.bootcss.com/semantic-ui/2.4.1/semantic.min.css" rel="stylesheet">
    <link th:href="@{/static/css/myStyle.css}" rel="stylesheet">
</head>
<body>

<!--主容器-->
<div class="ui container">

    <div class="ui segment" id="index-header-nav" th:fragment="nav-menu">
        <div class="ui secondary menu">
            <a class="item"  th:href="@{/index}">首页</a>

            <!--登录注销-->
            <div class="right menu">
                <!--如果未登录-->
                <div sec:authorize="!isAuthenticated()">    <!--判断是否登录,若“未登录”,则显示“登录按钮”-->
                    <a class="item" th:href="@{/toLogin}">
                        <i class="address card icon"></i> 登录
                    </a>
                </div>

                <div sec:authorize="isAuthenticated()">    <!--判断是否登录,若“已登录”,则显示“用户名 + 注销按钮”-->
                    <a class="item">
                        用户名:<span sec:authentication="name"></span>
                        权限:<span sec:authentication="authorities"></span>
                    </a>
                </div>

                <div sec:authorize="isAuthenticated()">    <!--判断是否登录,若“已登录”,则显示“用户名 + 注销按钮”-->
                    <!--如果已登录:用户名+注销-->
                    <a class="item" th:href="@{/logout}">
                        <i class="sign-out icon"></i> 注销
                    </a>
                </div>

                <!--已登录
                <a th:href="@{/usr/toUserCenter}">
                    <i class="address card icon"></i> admin
                </a>
                -->
            </div>
        </div>
    </div>

    <div class="ui segment" style="text-align: center">
        <h3>Spring Security Study by Youzg</h3>
    </div>

    <div>
        <br>
        <div class="ui three column stackable grid">

            <!--菜单根据用户的权限动态实现-->
            <div class="column" sec:authorize="hasRole('vip1')">
                <div class="ui raised segment">
                    <div class="ui">
                        <div class="content">
                            <h5 class="content">Level 1</h5>
                            <hr>
                            <div><a th:href="@{/level1/1}"><i class="bullhorn icon"></i> Level-1-1</a></div>
                            <div><a th:href="@{/level1/2}"><i class="bullhorn icon"></i> Level-1-2</a></div>
                            <div><a th:href="@{/level1/3}"><i class="bullhorn icon"></i> Level-1-3</a></div>
                        </div>
                    </div>
                </div>
            </div>

            <div class="column" sec:authorize="hasRole('vip2')">
                <div class="ui raised segment">
                    <div class="ui">
                        <div class="content">
                            <h5 class="content">Level 2</h5>
                            <hr>
                            <div><a th:href="@{/level2/1}"><i class="bullhorn icon"></i> Level-2-1</a></div>
                            <div><a th:href="@{/level2/2}"><i class="bullhorn icon"></i> Level-2-2</a></div>
                            <div><a th:href="@{/level2/3}"><i class="bullhorn icon"></i> Level-2-3</a></div>
                        </div>
                    </div>
                </div>
            </div>

            <div class="column" sec:authorize="hasRole('vip3')">
                <div class="ui raised segment">
                    <div class="ui">
                        <div class="content">
                            <h5 class="content">Level 3</h5>
                            <hr>
                            <div><a th:href="@{/level3/1}"><i class="bullhorn icon"></i> Level-3-1</a></div>
                            <div><a th:href="@{/level3/2}"><i class="bullhorn icon"></i> Level-3-2</a></div>
                            <div><a th:href="@{/level3/3}"><i class="bullhorn icon"></i> Level-3-3</a></div>
                        </div>
                    </div>
                </div>
            </div>

        </div>
    </div>
    
</div>


<script th:src="@{/static/js/jquery-3.1.1.min.js}"></script>
<script th:src="@{/static/js/semantic.min.js}"></script>

</body>
</html>

至于其它页面及静态资源,本人就不展示了,不是本文的核心
(相关完整代码将在总集篇的最后展示)

运行结果:

那么,当我们使用权限都有的账号进行登录时,会看到如下页面:
权限满 展示
而若是我们使用 只有vip1和vip权限的账号登录时,就会看到如下页面:
权限不足 展示
可以看到:

用户名和权限 都在随着账号信息改变
页面显示模块也会根据权限发生改变


原文地址:https://www.cnblogs.com/codderYouzg/p/13229870.html