zoukankan      html  css  js  c++  java
  • 【SpringSecurity】02 权限控制、自定义登陆、记住我

    资源过滤 权限控制】

    就之前的权限问题,例如一个user1登录成功去访问level1的资源当然没有问题

    但是页面还呈现了其他权限的资源,比如level2 & level3 既然呈现给了user1,

    user1自然而然的就会去访问这些不属于他权限的资源

    所以从源头解决的话,用户看不到这些资源不就行了吗?

    【Security & Thymeleaf 的结合使用】

    当前使用的模板引擎是Thymeleaf,这个引擎可以和Security结合使用

    注意一定要更换SpringBoot版本为2.0.9的

    在Junit测试使用的包都不一样了

    把错误的导包信息删除,重新导包即可

    组件坐标:

    <dependency>
        <groupId>org.thymeleaf.extras</groupId>
        <artifactId>thymeleaf-extras-springsecurity4</artifactId>
        <version>3.0.4.RELEASE</version>
    </dependency>

    页面的导航栏进行设置:

                <!--登录注销-->
                <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">
                            <i class="address card icon"></i>
                            用户名:<span sec:authentication="principal.username"></span>
                            角色:<span sec:authentication="principal.authorities"></span>
                        </a>
                    </div>
    
                    <div sec:authorize="isAuthenticated()">
                        <a class="item" th:href="@{/logout}">
                            <i class="sign-out icon"></i> 注销
                        </a>
                    </div>
                </div>

    然后这个页面的导航栏的标签才会其效果:

    老版本的登陆样式:

    效果:

    显示的很清楚具备哪些角色

    但是这时候注销403禁止访问了。。。

    【关闭伪造请求的防御】

    解决注销403的问题

    http.csrf().disable();//关闭csrf功能:跨站请求伪造,默认只能通过post方式提交logout请求

    【对访问的元素控制】

    <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>

    可以看到首页什么资源都没有了,因为我们没有作为用户访问

    用户只能访问他们所具备的角色所具备的权限:

    【记住我功能】

            // 记住我
            http.rememberMe();

    登录页会多出一个选项:

    如果密码错误,则不会生效,并且提示错误信息:

    如果登陆成功,则把浏览器关闭:再打开访问:

    可以看到直接登陆成功了

    可以看到是一个Cookie保证我们的信息验证,保存周期14天

    如果浏览器清除了Cookie,那么这个记住我就作废了

    【设置自己的Login页面】

            // 设置自己的登陆页
            http.formLogin().loginPage("/toLogin");

    登陆页面的表单设置为:

    <form th:action="@{/toLogin}" method="post">

     

    【设置页面的记住我】

    <input type="checkbox" name="rememberMe"> 记住我

    在配置类中设置:

    http.rememberMe().rememberMeParameter("rememberMe");
  • 相关阅读:
    JSP环境探针-当前电脑所有系统参数
    SqlServer service broker 分布式系统(赵松桃)跳水 2005 数据库编程
    主机Window不能访问该虚拟机Linux Samba文件服务提供了一个文件夹
    hdu 4901 The Romantic Hero
    linux、hdfs、hive、hbase经常使用的命令
    Android 设计模式模式适配器
    PHP扩展memcache模
    算法——字符串匹配Rabin-Karp算法
    三个重要的散列演示
    CodeForces 10C. Digital Root
  • 原文地址:https://www.cnblogs.com/mindzone/p/13396411.html
Copyright © 2011-2022 走看看