最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringSecurity中的表單認證詳細解析

 更新時間:2023年12月25日 08:32:20   作者:快樂的小三菊  
這篇文章主要介紹了SpringSecurity中的表單認證詳細解析,在上一篇文章中,我們初步引入了?Spring?Security,并使用其默認生效的?HTTP?基本認證保護?URL?資源,在本篇文章中我們使用表單認證來保護?URL?資源,需要的朋友可以參考下

一、默認表單認證:

首先,新建一個 configuration 包用于存放通用配置;然后新建一個 WebSecurityConfig 類,使其繼承 WebSecurityConfigurerAdapter ,如下所示:

@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter{
}

在給WebSecurityConfig 類上加上 @EnableWebSecurity 注解后,便會自動被 Spring 發(fā)現(xiàn)并注冊(點擊@EnableWebSecurity 注解可以看到 @Configuration 注解已經(jīng)存在,所以此處不需要額外添加)。

我們接著查看WebSecurityConfigurerAdapter 類對 configure(HttpSecurity http)方法的定義。如下所示:

protected void configure(HttpSecurity http) throws Exception {
		logger.debug("Using default configure(HttpSecurity). If subclassed this 
			will potentially override subclass configure(HttpSecurity).");
		http
			.authorizeRequests()
				.anyRequest().authenticated()
				.and()
			.formLogin().and()
			.httpBasic();
	}

可以看到WebSecurityConfigurerAdapter 已經(jīng)默認聲明了一些安全特性:

a、驗證所有用戶請求。

b、允許用戶使用表單登錄進行身份驗證(Spring Security 提供了一個簡單的表單登錄頁面)。

c、允許用戶使用 HTTP 基本認證。

現(xiàn)在重啟服務(wù),應(yīng)用新的安全配置??梢灶A(yù)見,在下次訪問 localhost:8080 時,系統(tǒng)會要求我們進行表單認證。如下圖所示:

在上圖中我們可以發(fā)現(xiàn),我們訪問的地址自動跳轉(zhuǎn)到 localhost:8080/login ,這正是 Spring Security 的默認登錄頁,只需要輸入正確的用戶名和密碼便可跳轉(zhuǎn)到回原來的訪問地址。

二、自定義表單認證

1、初步配置自定義表單登錄頁

雖然自動生成的表單登錄頁可以方便、快速地啟動,但是大多數(shù)應(yīng)用程序更希望提供自己的表單登錄頁,此時就需要覆蓋 configure() 方法,如下所示:

@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter{
	protected void configure(HttpSecurity http) throws Exception{
		http.authorizeRequests()
			.anyRequest().authenticated()
			.and()	
		.formLogin().
			loginPage("/myLogin.html")
			// 使登錄頁不設(shè)限訪問
			.permitAll()
			.and().
		csrf().disable();
	}
}

2、認識 HttpSecurity

HttpSecurity 實際上對應(yīng)了 Spring Security 命名空間配置方式中 xml 文件內(nèi)的標(biāo)簽。允許我們?yōu)樘囟ǖ?http 請求配置安全策略。

xml 文件中,聲明大量配置早已司空見慣;但在 Java 配置中,按照傳統(tǒng)的方式,我們需要這樣來調(diào)用,如下所示:

@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter{
	protected void configure(HttpSecurity http) throws Exception{
		ExpressionUrlAuthorizationConfigurer.ExpressionInterceptUrlRegistry 
			urlRegistry=http.authorizeRequests();
		ExpressionUrlAuthorizationConfigurer.AuthorizedUrl authorizedUrl =
			(ExpressionUrlAuthorizationConfigurer.AuthorizedUrl)urlRegistry
				.anyRequest();
		authorizedUrl.authenticated();
		// more
		FormLoginConfigurer<HttpSecurity> formLoginConfigurer = 
			http.formLogin();
		formLoginConfigurer.loginPage("/myLogin.html");
		formLoginConfigurer.permitAll();
		// more
	}
}

可以想象出這是多么煩瑣且令人痛苦的一件事。HttpSecurity 首先被設(shè)計為鏈?zhǔn)秸{(diào)用,在執(zhí)行每個方法后,都會返回一個預(yù)期的上下文,便于連續(xù)調(diào)用。我們不需要關(guān)心每個方法究竟返回了什么、如何進行下一個配置等細節(jié)。

HttpSecurity 提供了很多配置相關(guān)的方法,分別對應(yīng)命名空間配置中的子標(biāo)簽 <http>。例如,authorizeRequests()formLogin()、httpBasic() csrf() 分別對應(yīng) <intercept-url>、<form-login>、<http-basic><csrf> 標(biāo)簽。調(diào)用這些方法之后,除非使用 and() 方法結(jié)束當(dāng)前標(biāo)簽,上下文才會回到 HttpSecurity ,否則鏈?zhǔn)秸{(diào)用的上下文將自動進入對應(yīng)的標(biāo)簽域

authorizeRequests() 方法實際上返回了一個 URL 攔截注冊器,我們可以調(diào)用它提供的 anyRequest()、antMatchers() regexMatchers() 等方法來匹配系統(tǒng)的 URL ,并為其指定安全策略。

formLogin()httpBasic() 方法都聲明了需要 Spring Security 提供的表單認證方式,分別返回對應(yīng)的配置器。其中,formLogin.loginPage("/myLogin.html") 指定自定義的登錄頁為/myLogin.html ,同時,Spring Security 會用 /myLogin.html 注冊一個 POST 路由,用于接收登錄請求。

csrf() 方法是 Spring Security 提供的跨站請求偽造防護功能,當(dāng)我們繼承WebSecurityConfigurerAdapter 會默認開啟 csrf() 方法,關(guān)于 csrf() 方法的更多內(nèi)容會在后面的章節(jié)專門探討,以使測試進程更加順利。

重新啟動服務(wù)后在此訪問 localhost:8080 ,頁面會自動跳轉(zhuǎn)到 localhost:8080/myLogin.html。由于 /myLogin.html 無法定位到頁面資源,所以會顯示一個 404 頁面,如下所示:

3、編寫表單登錄頁

表單登錄頁myLogin.html的代碼如下所示:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>登錄</title>
</head>
<body>
	<div class = "login" style="width:300px;height:300px">
		<h2>Acced Form</h2>
		<div class ="login-top"></div>
		<h1>LOGIN FORM</h1>
		<form action="myLogin.html" method="post">
			<input type="text" name="username" placeholder="username"/> 
			<input type="password" name="password" placeholder="password"/> 
			<div class="forgot" style="margin-top:20px;">
				<a href="#">forgot Password</a>
				<input type="submit" value="login">
			</div>
		</form>
		<div class="login-bottom">
			<h3>New User  <a href ="">Register</a>  </h3>
		</div>
	</div>
</body>
</html>

在表單登錄頁中,僅有一個表單,用戶名和密碼分別為 username password,并以 POST 的方式提交到 /myLogin.html。

我們將該文件放置在 resources/static/ 下。重啟服務(wù),再次訪問 localhost:8080,即可看到自定義的表單登錄頁,如下所示:

輸入正確的用戶名和密碼后,單擊 login 按鈕,即可成功跳轉(zhuǎn)。

4、其他表單配置項

在自定義表單登錄頁之后,處理登錄請求的 URL 也會相應(yīng)改變,如何自定義 URL 呢?很簡單, Spring Security 在表單定制里提供了相應(yīng)的支持,代碼如下所示:

@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter{
	protected void configure(HttpSecurity http) throws Exception{
		http.authorizeRequests()
			.anyRequest().authenticated()
			.and()
		.formLogin()
			.loginPage("/myLogin.html")
			.loginProcessingUrl("/login")
			.permitAll()
			.and()
		.csrf().disable();
	}
}

此時,有些讀者可能會有疑問,因為按照慣例,在發(fā)送登錄請求并認證成功之后,頁面會跳轉(zhuǎn)回原訪問頁。在某些系統(tǒng)中的確是跳轉(zhuǎn)回原訪問頁的,但在部分前后端完全分離、僅靠 json完成所有交互的系統(tǒng)中,一般會在登錄時返回一段 json數(shù)據(jù),告知前端成功登錄成功與否,由前端決定如何處理后續(xù)邏輯,而非由服務(wù)器主動執(zhí)行頁面跳轉(zhuǎn)。這在 Spring Security 中同樣可以實現(xiàn):

@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter{
	protected void configure(HttpSecurity http) throws Exception{
		http.authorizeRequests()
		.anyRequest().authenticated()
		.and()
		.formLogin()
		.loginPage("/myLogin.html")
		.loginProcessingUrl("/login")
		.successHandler(new AuthenticationSuccessHandler() {
			@Override
			public void onAuthenticationSuccess(HttpServletRequest arg0, 
					HttpServletResponse arg1, Authentication arg2)
							throws IOException, ServletException {
				arg1.setContentType("application/json;charset=UTF-8");
				PrintWriter out = arg1.getWriter();
				out.write("{\"error_code\":\"0\",\"message\":\"歡迎登錄系統(tǒng)\"}");
			}
		})
		.failureHandler(new AuthenticationFailureHandler() {
			@Override
			public void onAuthenticationFailure(HttpServletRequest arg0,
					HttpServletResponse arg1, AuthenticationException arg2)
							throws IOException, ServletException {
				arg1.setContentType("application/json;charset=UTF-8");
				arg1.setStatus(401);
				PrintWriter out = arg1.getWriter();
				// 輸出失敗的原因
				out.write("{\"error_code\":\"401\",\"name\":\""+arg2.getCause()+"\","
						+ "\"message\":\""+arg2.getMessage()+"\"}}");
			}
		})
		.and()
		.csrf().disable();
	}
}

表單登錄配置模塊提供了 successHandler() failureHandler() 兩個方法,分別處理登錄成功和登錄失敗的邏輯。

其中,successHandler() 方法帶有一個 Authentication 參數(shù),攜帶當(dāng)前登錄用戶名及其角色等信息;而 failureHandler() 方法攜帶一個 AuthenticationException 異常參數(shù)。

具體處理方式需按照系統(tǒng)的情況自定義。

在形式上,我們確實使用了 Spring Security 的表單認證功能,并且自定義了表單登錄頁。但實際上,這還遠遠不夠。

例如,在實際系統(tǒng)中,我們正常登錄時使用的用戶名和密碼都來自數(shù)據(jù)庫,這里卻都寫在配置上。

更進一步,我們可以對每個登錄用戶都設(shè)定詳細的權(quán)限,而并非一個通用角色。這些內(nèi)容將在后面章節(jié)講解。

到此這篇關(guān)于SpringSecurity中的表單認證詳細解析的文章就介紹到這了,更多相關(guān)SpringSecurity表單認證內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 在@Value注解內(nèi)使用SPEL自定義函數(shù)方式

    在@Value注解內(nèi)使用SPEL自定義函數(shù)方式

    這篇文章主要介紹了在@Value注解內(nèi)使用SPEL自定義函數(shù)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • 基于springboot實現(xiàn)redis分布式鎖的方法

    基于springboot實現(xiàn)redis分布式鎖的方法

    這篇文章主要介紹了基于springboot實現(xiàn)redis分布式鎖的方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • 使用SpringBoot實現(xiàn)自動發(fā)送注冊驗證碼郵件功能

    使用SpringBoot實現(xiàn)自動發(fā)送注冊驗證碼郵件功能

    一直以來,我都對程序如何自動發(fā)送郵件感到好奇,想象一下,當(dāng)你在某個網(wǎng)站注冊時,輸入郵箱后不久就收到一封帶有驗證碼的郵件,這種體驗既方便又高效,所以本文給大家介紹了如何用?Spring?Boot?實現(xiàn)自動發(fā)送注冊驗證碼郵件,需要的朋友可以參考下
    2025-04-04
  • Java實現(xiàn)彈窗效果的基本操作

    Java實現(xiàn)彈窗效果的基本操作

    這篇文章主要為大家詳細介紹了Java實現(xiàn)彈窗效果的基本操作,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • 詳解Mybatis中的PooledDataSource

    詳解Mybatis中的PooledDataSource

    這篇文章主要介紹了詳解Mybatis中的PooledDataSource,PooledDataSource使用了數(shù)據(jù)庫連接池可以實現(xiàn)數(shù)據(jù)庫連接池的重復(fù)利用,還能控制連接數(shù)據(jù)庫的連接上限
    2022-06-06
  • 一步步教會你使用Java原生指令編譯并運行一個程序

    一步步教會你使用Java原生指令編譯并運行一個程序

    Java是一種廣泛使用的編程語言,具有跨平臺性和面向?qū)ο蟮奶匦?下面這篇文章主要給大家介紹了關(guān)于使用Java原生指令編譯并運行一個程序的相關(guān)資料,需要的朋友可以參考下
    2024-07-07
  • Java JSONObject與JSONArray對象案例詳解

    Java JSONObject與JSONArray對象案例詳解

    這篇文章主要介紹了Java JSONObject與JSONArray對象案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • 淺談Java編程中string的理解與運用

    淺談Java編程中string的理解與運用

    這篇文章主要介紹了淺談Java編程中string的理解與運用,還是比較不錯的,這里分享給大家,供需要的朋友參考。
    2017-11-11
  • java輸入數(shù)字,輸出倒序的實例

    java輸入數(shù)字,輸出倒序的實例

    這篇文章主要介紹了java輸入數(shù)字,輸出倒序的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • 基于java編寫局域網(wǎng)多人聊天室

    基于java編寫局域網(wǎng)多人聊天室

    這篇文章主要為大家詳細介紹了基于java編寫局域網(wǎng)多人聊天室的相關(guān)資料,使用socket基于java編寫一個局域網(wǎng)聊天室,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-09-09

最新評論

新余市| 大安市| 莱芜市| 两当县| 资溪县| 定西市| 土默特左旗| 郯城县| 开平市| 葫芦岛市| 鄂尔多斯市| 惠来县| 阿鲁科尔沁旗| 维西| 息烽县| 珠海市| 裕民县| 迭部县| 博兴县| 阳泉市| 盱眙县| 龙陵县| 鞍山市| 金堂县| 巢湖市| 枣阳市| 历史| 固阳县| 日照市| 昭通市| 南通市| 长宁区| 乌审旗| 抚远县| 渑池县| 铜陵市| 虞城县| 淄博市| 亳州市| 清水县| 鹤山市|