zoukankan      html  css  js  c++  java
  • 【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权限的账号登录时,就会看到如下页面:
    权限不足 展示
    可以看到:

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


  • 相关阅读:
    项目知识
    设计师如何为 Android 应用标注尺寸
    Android开发注意事项
    线程的同步和异步
    复习:IPC机制
    简单的Mvp设计
    泛型
    RxBus的使用
    LinearLayout遇到的问题——利用LinearLayout做横向滑动冲突
    Google搜索技巧、使用Google的其它专业搜索
  • 原文地址:https://www.cnblogs.com/codderYouzg/p/13229870.html
Copyright © 2011-2022 走看看