【SpringSecurity】02 許可權控制、自定義登陸、記住我
阿新 • • 發佈:2020-07-29
【資源過濾許可權控制】
就之前的許可權問題,例如一個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">