1. 程式人生 > 實用技巧 >【SpringSecurity】02 許可權控制、自定義登陸、記住我

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