目錄
一 、認識SpringSecurity
二、環境搭建 認證和授權
1、引入Spring Security模塊
2、撰寫Spring Security配置類
3、定制請求的授權規則
4、在SecurityConfigure中開啟自動配置的登錄功能
5、自定義認證規則
三 、注銷
1、開啟自動配置的注銷功能
2、增加一個注銷按鈕
3、自定義注銷(注銷成功后跳轉到指定頁面)
四、權限控制
1、匯入依賴
2、 修改前端頁面
1、匯入命名口空間
2、修改導航欄,增加認證判斷
3、解決注銷404了
3、角色功能模塊
五、定制登錄頁面
1、開啟記住我功能
2、自定義登錄首頁
一 、認識SpringSecurity
Spring Security 是針對Spring專案的安全框架,也是Spring Boot底層安全模塊默認的技術選型,他可以實作強大的Web安全控制,對于安全控制,我們僅需要引入 spring-boot-starter-security 模塊,進行少量的配置,即可實作強大的安全管理,
記住幾個類:
WebSecurityConfigurerAdapter: 自定義Security策略
AuthenticationManagerBuilder:自定義認證策略
@EnableWebSecurity:開啟WebSecurity模式 @Enablexxx 開啟xx模式
Spring Security的兩個主要目標是 “認證” 和 “授權”(訪問控制),
“認證”(Authentication)
身份驗證是關于驗證您的憑據,如用戶名/用戶ID和密碼,以驗證您的身份,
身份驗證通常通過用戶名和密碼完成,有時與身份驗證因素結合使用,
“授權” (Authorization)
授權發生在系統成功驗證您的身份后,最侄訓授予您訪問資源(如資訊,檔案,資料庫,資金,位置,幾乎任何內容)的完全權限,
二、環境搭建 認證和授權
1、引入Spring Security模塊
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
2、撰寫Spring Security配置類
package com.kuang.config;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurity
ConfigurerAdapter;
@EnableWebSecurity // 開啟WebSecurity模式
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
}
}
3、定制請求的授權規則
//請求授權的規則 如果沒有權限會報403錯誤(沒有權限)
http.authorizeRequests().antMatchers("/").permitAll()//所有用戶都可以訪問首頁
.antMatchers("/level1/**").hasRole("vip1")//vip1的用戶可以訪問level1下的資
.antMatchers("/level2/**").hasRole("vip2")//vip2的用戶可以訪問level2下的資
.antMatchers("/level3/**").hasRole("vip3");//vip3的用戶可以訪問level3下的資
4、在SecurityConfigure中開啟自動配置的登錄功能
//沒有權限訪問會默認到登錄頁面,需要開啟登錄的頁面
http.formLogin();
5、自定義認證規則
@Override//認證
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
//下面這些資料可以從資料庫中讀取 也可以從記憶體中讀取 {noop}是對密碼進行加密 不加密會報500錯誤
auth.inMemoryAuthentication()
.withUser("rk").password("{noop}123456").roles("vip2","vip3")
.and()
.withUser("root").password("{noop}123456").roles("vip1","vip2","vip3")
.and()
.withUser("guest").password("{noop}123456").roles("vip1");
}
測驗 :使用rk進行登錄

訪問:level1的資源

訪問level2、level3


三 、注銷
1、開啟自動配置的注銷功能
//定制請求的授權規則
@Override
protected void configure(HttpSecurity http) throws Exception {
//開啟自動配置的注銷的功能
// /logout 注銷請求
http.logout();
}
2、增加一個注銷按鈕
路徑為:/logout
<a class="item" th:href="@{/logout}">
<i class="address card icon"></i> 注銷
</a>
3、自定義注銷(注銷成功后跳轉到指定頁面)
// .logoutSuccessUrl("/"); 注銷成功來到首頁
http.logout().logoutSuccessUrl("/");
四、權限控制
需求:
1、用戶沒有登錄的時候,導航欄上只顯示登錄按鈕,用戶登錄之后,導航欄可以顯示登錄的用戶資訊及注銷按鈕
2、比如rk這個用戶,它只有 vip2,vip3功能,那么登錄則只顯示這兩個功能,而vip1的功能選單不顯示
thymeleaf和springsecurity整合包
1、匯入依賴
<dependency>
<groupId>org.thymeleaf.extras</groupId>
<artifactId>thymeleaf-extras-springsecurity5</artifactId>
<version>3.0.4.RELEASE</version>
</dependency>
2、 修改前端頁面
1、匯入命名口空間
xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity5"
2、修改導航欄,增加認證判斷
<!--登錄注銷-->
<div class="right menu">
<!--如果未登錄 首頁只顯示登錄-->
<div sec:authorize="!isAuthenticated()">
<a class="item" th:href="@{/login}">
<i class="address card icon"></i> 登錄
</a>
</div>
<!--isAuthenticated()表示已登錄 如果已登錄 顯示用戶名,角色 和注銷-->
<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="address card icon"></i> 注銷
</a>
</div>
3、解決注銷404了
因為它默認防止csrf跨站請求偽造,因為會產生安全問題,我們可以將請求改為post表單提交,或者在spring security中關閉csrf功能 ,
http.csrf().disable();//關閉csrf功能:跨站請求偽造,默認只能通過post方式提交logout請求
http.logout().logoutSuccessUrl("/");
此時已經完成需求1,接下來完成需求2
3、角色功能模塊
在需要分角色顯示的模塊加上:sec:authorize="hasRole('角色')"
<div class="ui three column stackable grid">
<!--該模塊設定vip1的權限-->
<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>
<!--該模塊設定vip2的權限-->
<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>
<!--該模塊設定vip3的權限-->
<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>
五、定制登錄頁面
1、開啟記住我功能
//開啟記住我
http.rememberMe();
此時在自帶的登錄頁面中會增加一個登錄我的按鈕
2、自定義登錄首頁
在開啟登錄加入其它引數
//沒有權限會默認到登錄頁面,需要開啟登錄的頁面
http.formLogin()
.loginPage("/toLogin")//自定義的登錄頁面
.loginProcessingUrl("/login")//登錄表單from的action地址
.defaultSuccessUrl("/rk");//登錄成功后跳轉的路徑
修改login.html的表單提交路徑
<form th:action="@{/login}" method="post">
此時剛剛加入的登錄我按鈕已經不生效了,因為我們自定義了新的登錄頁面
在前端頁面加上記住我的按鈕
<div class="field">
<input type="checkbox" name="remember">記住我
</div>
增加開啟記住我的引數,值為記住我的name屬性值
//開啟記住我
http.rememberMe().rememberMeParameter("remember");

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/340653.html
標籤:其他
