![Spring Boot企業(yè)級(jí)開發(fā)教程(第2版) 課件 第7-10章 Spring Boot安全管理- Spring Boot綜合項(xiàng)目實(shí)戰(zhàn) 瑞吉外賣_第1頁](http://file4.renrendoc.com/view12/M01/04/00/wKhkGWZfxyiAbRxJAAB1nStmVcw993.jpg)
![Spring Boot企業(yè)級(jí)開發(fā)教程(第2版) 課件 第7-10章 Spring Boot安全管理- Spring Boot綜合項(xiàng)目實(shí)戰(zhàn) 瑞吉外賣_第2頁](http://file4.renrendoc.com/view12/M01/04/00/wKhkGWZfxyiAbRxJAAB1nStmVcw9932.jpg)
![Spring Boot企業(yè)級(jí)開發(fā)教程(第2版) 課件 第7-10章 Spring Boot安全管理- Spring Boot綜合項(xiàng)目實(shí)戰(zhàn) 瑞吉外賣_第3頁](http://file4.renrendoc.com/view12/M01/04/00/wKhkGWZfxyiAbRxJAAB1nStmVcw9933.jpg)
![Spring Boot企業(yè)級(jí)開發(fā)教程(第2版) 課件 第7-10章 Spring Boot安全管理- Spring Boot綜合項(xiàng)目實(shí)戰(zhàn) 瑞吉外賣_第4頁](http://file4.renrendoc.com/view12/M01/04/00/wKhkGWZfxyiAbRxJAAB1nStmVcw9934.jpg)
![Spring Boot企業(yè)級(jí)開發(fā)教程(第2版) 課件 第7-10章 Spring Boot安全管理- Spring Boot綜合項(xiàng)目實(shí)戰(zhàn) 瑞吉外賣_第5頁](http://file4.renrendoc.com/view12/M01/04/00/wKhkGWZfxyiAbRxJAAB1nStmVcw9935.jpg)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第7章SpringBoot安全管理《SpringBoot企業(yè)級(jí)開發(fā)教程(第2版)》學(xué)習(xí)目標(biāo)/Target了解安全框架概述,能夠簡(jiǎn)述SpringSecurity和Shiro的作用掌握SpringSecurity入門案例,能夠基于SpringBoot項(xiàng)目完成SpringSecurity入門案例了解SpringSecurity結(jié)構(gòu)總覽,能夠簡(jiǎn)述SpringSecurity過濾器處理請(qǐng)求的流程熟悉SpringSecurity認(rèn)證流程,能夠簡(jiǎn)述SpringSecurity的認(rèn)證流程掌握SpringSecurity自定義身份認(rèn)證,能夠基于內(nèi)存身份認(rèn)證、JDBC身份認(rèn)證和自定義UserDetailsService實(shí)現(xiàn)用戶身份認(rèn)證學(xué)習(xí)目標(biāo)/Target熟悉SpringSecurity授權(quán)流程,能夠簡(jiǎn)述SpringSecurity的授權(quán)流程掌握SpringSecurity自定義授權(quán),能夠使用Web授權(quán)和方法授權(quán)實(shí)現(xiàn)用戶授權(quán)管理掌握SpringSecurity會(huì)話管理,能夠在SpringSecurity中獲取認(rèn)證后的用戶信息,以及進(jìn)行會(huì)話控制掌握SpringSecurity用戶退出,能夠在SpringBoot項(xiàng)目中實(shí)現(xiàn)使用SpringSecurity實(shí)現(xiàn)用戶退出掌握動(dòng)態(tài)展示菜單,能夠通過SpringSecurity的授權(quán)管理實(shí)現(xiàn)動(dòng)態(tài)展示菜單章節(jié)概述/Summary實(shí)際開發(fā)中,開發(fā)者為了確保Web應(yīng)用的安全性,通常需要保護(hù)Web應(yīng)用的用戶信息、數(shù)據(jù)信息等資源不受侵害,例如,對(duì)于某些指定的功能,需要先對(duì)訪問的用戶進(jìn)行身份驗(yàn)證,驗(yàn)證通過后還需要具備相關(guān)權(quán)限之后才可以操作。下面將對(duì)SpringBoot的安全管理進(jìn)行詳細(xì)地講解。目錄/Contents7.17.2安全框架概述SpringSecurity基礎(chǔ)入門7.3SpringSecurity認(rèn)證管理7.4SpringSecurity授權(quán)管理7.5SpringSecurity會(huì)話管理和用戶退出安全框架概述7.17.1
安全框架概述先定一個(gè)小目標(biāo)!
先定一個(gè)小目標(biāo)!了解安全框架概述,能夠簡(jiǎn)述SpringSecurity和Shiro的作用7.1
安全框架概述Java中的安全框架通常是指解決Web應(yīng)用安全問題的框架,如果開發(fā)Web應(yīng)用時(shí)沒有使用安全框架,開發(fā)者需要自行編寫代碼增加Web應(yīng)用安全性。自行實(shí)現(xiàn)Web應(yīng)用的安全性并不容易,需要考慮不同的認(rèn)證和授權(quán)機(jī)制、網(wǎng)絡(luò)關(guān)鍵數(shù)據(jù)傳輸加密等多方面的問題,為此Web應(yīng)用中通常會(huì)選擇使用一些成熟的安全框架,這些安全框架基本都提供了一套Web應(yīng)用安全性的完整解決方案,以便提升Web應(yīng)用的安全性。Java中常用的安全框架有SpringSecurity和Shiro,這兩個(gè)安全框架都提供了強(qiáng)大功能,可以很容易實(shí)現(xiàn)Web應(yīng)用的很多安全防護(hù)。下面對(duì)這兩個(gè)安全框架的特點(diǎn)進(jìn)行講解。7.1
安全框架概述1.SpringSecuritySpringSecurity是Spring生態(tài)系統(tǒng)中重要的一員,是一個(gè)基于AOP思想和Servlet過濾器實(shí)現(xiàn)的安全框架,它提供了完善的認(rèn)證機(jī)制和方法級(jí)的授權(quán)功能,是一款非常優(yōu)秀的權(quán)限管理框架。SpringSecurity伴隨著Spring生態(tài)系統(tǒng)不斷修正、升級(jí),使用SpringSecurity減少了為企業(yè)系統(tǒng)安全控制編寫大量重復(fù)代碼的工作,在SpringBoot項(xiàng)目中使用SpringSecurity十分簡(jiǎn)單。7.1
安全框架概述1.SpringSecurity使用SpringSecurity可以很方便地實(shí)現(xiàn)Authentication(認(rèn)證)和Authorization(授權(quán)),其中認(rèn)證是指驗(yàn)證用戶身份的過程,授權(quán)是指驗(yàn)證用戶是否有權(quán)限訪問特定資源的過程。SpringSecurity在架構(gòu)上將認(rèn)證與授權(quán)分離,并提供了擴(kuò)展點(diǎn)。SpringSecurity具有以下的特點(diǎn)。靈活:SpringSecurity提供了一系列可擴(kuò)展的模塊,可以根據(jù)具體需求進(jìn)行選擇和配置。安全:SpringSecurity集成了一系列安全措施,包括XSS(Cross-SiteScripting,跨站腳本)攻擊防范、CSRF攻擊防范、點(diǎn)擊劫持攻擊防范等。易用:SpringSecurity提供了一系列快捷配置選項(xiàng),可以使開發(fā)人員輕松地實(shí)現(xiàn)認(rèn)證和授權(quán)等功能。社區(qū)支持:SpringSecurity作為Spring生態(tài)系統(tǒng)的一部分,與Spring無縫整合,并且得到了社區(qū)廣泛的支持和更新維護(hù)。7.1
安全框架概述2.ShiroShiro是apache旗下一個(gè)開源框架,它將軟件系統(tǒng)的安全認(rèn)證相關(guān)功能抽取出來,實(shí)現(xiàn)用戶身份認(rèn)證,授權(quán)、加密、會(huì)話管理等功能,組成了一個(gè)通用的安全認(rèn)證框架。Shiro具有如下特點(diǎn)。易于理解的JavaSecurityAPI。簡(jiǎn)單的身份認(rèn)證,支持LDAP,JDBC等多種數(shù)據(jù)源。支持對(duì)角色的簡(jiǎn)單鑒權(quán),也支持細(xì)粒度的鑒權(quán)。支持一級(jí)緩存,以提升應(yīng)用程序的性能。內(nèi)置的基于POJO企業(yè)會(huì)話管理,適用于Web以及非Web的環(huán)境。不跟任何的框架或者容器捆綁,可以獨(dú)立運(yùn)行。7.1
安全框架概述不管SpringSecurity還是Shiro,在進(jìn)行安全管理的過程中都涉及權(quán)限管理的兩個(gè)重要概念:認(rèn)證和授權(quán)。權(quán)限管理是指根據(jù)系統(tǒng)設(shè)置的安全規(guī)則或者安全策略,用戶可以訪問且只能訪問自己被授權(quán)的資源。實(shí)現(xiàn)權(quán)限管理通常需要三個(gè)對(duì)象,分別為用戶、角色、權(quán)限,這三個(gè)對(duì)象的說明如下。用戶:主要包含用戶名、密碼和當(dāng)前用戶的角色信息,可以實(shí)現(xiàn)認(rèn)證操作。角色:主要包含角色名稱、角色描述和當(dāng)前角色擁有的權(quán)限信息,可以實(shí)現(xiàn)授權(quán)操作。權(quán)限:權(quán)限也可以稱為菜單,主要包含當(dāng)前權(quán)限名稱、url地址等信息,可以實(shí)現(xiàn)動(dòng)態(tài)展示菜單。SpringSecurity基礎(chǔ)入門7.27.2.1SpringSecurity入門案例先定一個(gè)小目標(biāo)!
先定一個(gè)小目標(biāo)!掌握SpringSecurity入門案例,能夠基于SpringBoot項(xiàng)目完成SpringSecurity入門案例7.2.1SpringSecurity入門案例本入門案例主要演示SpringSecurity在SpringBoot中的安全管理效果。為了更好地使用SpringBoot整合實(shí)現(xiàn)SpringSecurity安全管理功能,體現(xiàn)案例中Authentication(認(rèn)證)和Authorization(授權(quán))功能的實(shí)現(xiàn),本案例在SpringBoot項(xiàng)目中結(jié)合SpringMVC和Thymeleaf實(shí)現(xiàn)訪問圖書管理后臺(tái)頁面。7.2.1SpringSecurity入門案例使用SpringInitializr方式創(chuàng)建一個(gè)名為chapter07的SpringBoot項(xiàng)目,在Dependencies依賴選擇中選擇SpringWeb、Thymeleaf和SpringSecurity的依賴,然后根據(jù)提示完成項(xiàng)目創(chuàng)建。1.創(chuàng)建SpringBoot項(xiàng)目7.2.1SpringSecurity入門案例在項(xiàng)目的resources目錄的templates和static文件夾中,分別引入案例的模板文件,以及頁面所需的靜態(tài)資源文件。2.導(dǎo)入頁面資源7.2.1SpringSecurity入門案例2.導(dǎo)入頁面資源導(dǎo)入的頁面文件有3個(gè),其中main.html為圖書管理的主頁面,book_list.html為圖書列表頁面,該頁面展示所有可閱讀的圖書信息,book_manag.html為圖書管理頁面,該頁面可以對(duì)圖書進(jìn)行增刪改等操作,這3個(gè)頁面的核心代碼如文件7-1~文件7-3所示。文件7-1main.html文件7-2book_list.html文件7-3book_manag.html源代碼7.2.1SpringSecurity入門案例3.創(chuàng)建控制器類在項(xiàng)目的java目錄下創(chuàng)建包c(diǎn)om.itheima.chapter07.controller,并在該包下創(chuàng)建實(shí)體類控制器類BookController,在該類中定義處理圖書列表和圖書管理請(qǐng)求的方法,具體如文件7-4所示。文件7-4BookController.java源代碼7.2.1SpringSecurity入門案例4.添加配置類導(dǎo)入的頁面文件有3個(gè),其中main.html為圖書管理的主頁面,book_list.html為圖書列表頁面,該頁面在項(xiàng)目的java目錄下創(chuàng)建包c(diǎn)om.itheima.chapter07.config,并在該包下創(chuàng)建配置類WebMvcConfig,在該類中添加視圖路徑映射,實(shí)現(xiàn)訪問項(xiàng)目首頁自動(dòng)映射到后臺(tái)管理首頁,具體如文件7-5所示。文件7-5WebMvcConfig.java源代碼7.2.1SpringSecurity入門案例5.測(cè)試項(xiàng)目效果啟動(dòng)項(xiàng)目,在瀏覽器訪問“http://localhost:8080/”。7.2.1SpringSecurity入門案例5.測(cè)試項(xiàng)目效果查看IDEA控制臺(tái)信息,信息中包含一些特別的內(nèi)容。7.2.1SpringSecurity入門案例5.測(cè)試項(xiàng)目效果在默認(rèn)登錄頁面中使用SpringSecurity提供的賬號(hào),以及生成的隨機(jī)密碼進(jìn)行登錄。7.2.2SpringSecurity結(jié)構(gòu)總覽先定一個(gè)小目標(biāo)!
先定一個(gè)小目標(biāo)!了解SpringSecurity結(jié)構(gòu)總覽,能夠簡(jiǎn)述SpringSecurity過濾器處理請(qǐng)求的流程7.2.2SpringSecurity結(jié)構(gòu)總覽當(dāng)初始化SpringSecurity時(shí),會(huì)創(chuàng)建一個(gè)類型為org.springframework.security.web.FilterChainProxy,名稱為springSecurityFilterChain過濾器,這個(gè)過濾器實(shí)現(xiàn)了javax.servlet.Filter接口,外部請(qǐng)求系統(tǒng)資源時(shí)會(huì)經(jīng)過此過濾器。7.2.2SpringSecurity結(jié)構(gòu)總覽SpringSecurity安全管理的實(shí)現(xiàn)主要是由過濾器鏈中一系列過濾器相互配合完成,下面對(duì)過濾器鏈中主要的幾個(gè)過濾器及其作用分別進(jìn)行說明。SecurityContextPersistenceFilter:是整個(gè)攔截過程的入口和出口,也就是第一個(gè)和最后一個(gè)攔截器。UsernamePasswordAuthenticationFilter:用于處理來自表單提交的認(rèn)證,提交的表單必須提供對(duì)應(yīng)的用戶名和密碼。FilterSecurityInterceptor:用于保護(hù)Web資源,獲取所配置資源訪問的授權(quán)信息。CsrfFilter:SpringSecurity會(huì)對(duì)所有Post請(qǐng)求驗(yàn)證是否包含系統(tǒng)生成的csrf的token信息,如果不包含,則報(bào)錯(cuò),起到防止csrf攻擊的效果。ExceptionTranslationFilter:能夠捕獲來自FilterChain所有的異常,并進(jìn)行處理。DefaultLoginPageGeneratingFilter:如果沒有在配置文件中指定認(rèn)證頁面,則由該過濾器生成一個(gè)默認(rèn)認(rèn)證頁面。SpringSecurity認(rèn)證管理7.37.3
SpringSecurity認(rèn)證管理認(rèn)證是SpringSecurity的核心功能之一,SpringSecurity所提供的認(rèn)證可以更好地保護(hù)系統(tǒng)的隱私數(shù)據(jù)與資源,只有當(dāng)用戶的身份合法后方可訪問該系統(tǒng)的資源。SpringSecurity提供了默認(rèn)的認(rèn)證相關(guān)配置,開發(fā)者也可以根據(jù)自己實(shí)際的環(huán)境進(jìn)行自定義身份認(rèn)證配置。下面對(duì)SpringSecurity的認(rèn)證流程以及自定義認(rèn)證進(jìn)行講解。7.3.1SpringSecurity認(rèn)證流程先定一個(gè)小目標(biāo)!
先定一個(gè)小目標(biāo)!熟悉SpringSecurity認(rèn)證流程,能夠簡(jiǎn)述SpringSecurity的認(rèn)證流程7.3.1SpringSecurity認(rèn)證流程用戶認(rèn)證就是判斷一個(gè)用戶的身份是否合法的過程,用戶訪問系統(tǒng)資源時(shí)系統(tǒng)要求驗(yàn)證用戶的身份信息,身份合法方可繼續(xù)訪問,否則拒絕其訪問。7.3.1SpringSecurity認(rèn)證流程SpringSecurity的認(rèn)證流程進(jìn)行詳細(xì)介紹。①用戶提交用戶名和密碼進(jìn)行認(rèn)證請(qǐng)求后,被SecurityFilterChain中的UsernamePasswordAuthenticationFilter過濾器獲取到,將用戶名和密碼封裝到UsernamePasswordAuthenticationToken對(duì)象中,該對(duì)象為Authentication的實(shí)現(xiàn)類。②過濾器將封裝用戶名和密碼的Authentication對(duì)象提交至AuthenticationManager(認(rèn)證管理器)進(jìn)行認(rèn)證。③AuthenticationManager根據(jù)當(dāng)前的認(rèn)證類型進(jìn)行認(rèn)證,認(rèn)證時(shí)會(huì)根據(jù)提交的用戶信息最終返回一個(gè)SpringSecurity的UserDetails對(duì)象,如果返回的UserDetails對(duì)象為空,則說明認(rèn)證失敗,拋出異常。7.3.1SpringSecurity認(rèn)證流程④如果返回的UserDetails對(duì)象不為空,則返回UserDetails對(duì)象,最后AuthenticationManager認(rèn)證管理器返回一個(gè)被填充滿了信息的Authentication實(shí)例,包括權(quán)限信息,身份信息,細(xì)節(jié)信息,但密碼通常會(huì)被移除。⑤SecurityContextHolder安全上下文容器存放填充了信息的Authentication,認(rèn)證成功后通過SecurityContextHolder.getContext().setAuthentication()方法,將Authentication設(shè)置到其中。7.3.2SpringSecurity自定義身份認(rèn)證先定一個(gè)小目標(biāo)!
先定一個(gè)小目標(biāo)!掌握SpringSecurity自定義身份認(rèn)證,能夠基于內(nèi)存身份認(rèn)證、JDBC身份認(rèn)證和自定義UserDetailsService實(shí)現(xiàn)用戶身份認(rèn)證7.3.2SpringSecurity自定義身份認(rèn)證盡管項(xiàng)目啟動(dòng)時(shí),SpringSecurity會(huì)提供了默認(rèn)的用戶信息,可以快速認(rèn)證和啟動(dòng),但大多數(shù)應(yīng)用程序都希望使用自定義的用戶認(rèn)證。對(duì)于自定義用戶認(rèn)證,SpringSecurity提供了多種認(rèn)證方式,常用的有In-MemoryAuthentication(內(nèi)存身份認(rèn)證)、JDBCAuthentication(JDBC身份認(rèn)證)和UserDetailsService(身份詳情服務(wù))。下面對(duì)SpringSecurity的這三種自定義身份認(rèn)證進(jìn)行詳細(xì)講解。7.3.2SpringSecurity自定義身份認(rèn)證以內(nèi)存身份認(rèn)證時(shí),需要在SpringSecurity的相關(guān)組件中進(jìn)行指定當(dāng)前認(rèn)證方式為內(nèi)存身份認(rèn)證。SpringSecurity5.7.1開始SpringSecurity將WebSecurityConfigurerAdapter類標(biāo)注為過時(shí),推薦直接聲明配置類,在配置類中直接定義組件的信息。本書使用SpringBoot2.7.6,其對(duì)應(yīng)的SpringSecurity版本為5.7.5。自定義內(nèi)存身份認(rèn)證時(shí),可以通過InMemoryUserDetailsManager類實(shí)現(xiàn),InMemoryUserDetailsManager是UserDetailsService的一個(gè)實(shí)現(xiàn)類,方便在內(nèi)存中創(chuàng)建一個(gè)用戶。對(duì)此,只需
在自定義配置類中創(chuàng)建InMemoryUserDetailsManager實(shí)例,在該實(shí)例中指定該實(shí)例的認(rèn)證信息,并存入在Spring容器中即可。1.內(nèi)存身份認(rèn)證7.3.2SpringSecurity自定義身份認(rèn)證(1)創(chuàng)建配置類在chapter07項(xiàng)目中創(chuàng)建名為com.itheima.config的包,并在該包下創(chuàng)建一個(gè)配置類WebSecurityConfig,在該類中創(chuàng)建UserDetailsService類型的InMemoryUserDetailsManager實(shí)例對(duì)象交由Spring容器管理,具體如文件7-6所示。1.內(nèi)存身份認(rèn)證文件7-6WebSecurityConfig.java源代碼7.3.2SpringSecurity自定義身份認(rèn)證進(jìn)行自定義用戶認(rèn)證時(shí),需要注意以下幾個(gè)問題。提交認(rèn)證時(shí)會(huì)對(duì)輸入的密碼使用密碼編譯器進(jìn)行加密并與正確的密碼進(jìn)行校驗(yàn)。如果不想要對(duì)輸入的密碼進(jìn)行加密,需要在密碼前對(duì)使用{noop}進(jìn)行標(biāo)注。從SpringSecurity5開始,自定義用戶認(rèn)證如果沒有設(shè)置密碼編碼器,也沒有在密碼前使用{noop}進(jìn)行標(biāo)注,會(huì)認(rèn)證失敗。自定義用戶認(rèn)證時(shí),可以定義用戶角色roles,也可以定義用戶權(quán)限authorities,在進(jìn)行賦值時(shí),權(quán)限通常是在角色值的基礎(chǔ)上添加“ROLE_”前綴。自定義用戶認(rèn)證時(shí),可以為某個(gè)用戶一次指定多個(gè)角色或權(quán)限。1.內(nèi)存身份認(rèn)證7.3.2SpringSecurity自定義身份認(rèn)證(2)驗(yàn)證內(nèi)存身份認(rèn)證啟動(dòng)項(xiàng)目后,查看控制臺(tái)輸出的信息,發(fā)現(xiàn)沒有默認(rèn)安全管理時(shí)隨機(jī)生成了密碼。在瀏覽器訪問項(xiàng)目首頁“http://localhost:8080/”。1.內(nèi)存身份認(rèn)證7.3.2SpringSecurity自定義身份認(rèn)證使用不是文件7-6中設(shè)置的用戶信息進(jìn)行登錄。1.內(nèi)存身份認(rèn)證7.3.2SpringSecurity自定義身份認(rèn)證使用文件7-6中設(shè)置的用戶信息進(jìn)行登錄。1.內(nèi)存身份認(rèn)證7.3.2SpringSecurity自定義身份認(rèn)證JDBC身份認(rèn)證是通過JDBC連接數(shù)據(jù)庫,基于數(shù)據(jù)庫中已有的用戶信息進(jìn)行身份認(rèn)證,這樣避免了內(nèi)存身份認(rèn)證的弊端,可以實(shí)現(xiàn)對(duì)系統(tǒng)已注冊(cè)的用戶進(jìn)行身份認(rèn)證。JdbcUserDetailsManager是SpringSecurity內(nèi)置的UserDetailsService的實(shí)現(xiàn)類,使用JdbcUserDetailsManager可以通過JDBC將數(shù)據(jù)庫和SpringSecurity連接起來。下面對(duì)JDBC身份認(rèn)證方式進(jìn)行講解。2.JDBC身份認(rèn)證7.3.2SpringSecurity自定義身份認(rèn)證(1)數(shù)據(jù)準(zhǔn)備使用之前創(chuàng)建的名為springbootdata的數(shù)據(jù)庫,在該數(shù)據(jù)庫中創(chuàng)建三個(gè)表user、priv和user_priv,并預(yù)先插入幾條測(cè)試數(shù)據(jù)。準(zhǔn)備數(shù)據(jù)的SQL語句如文件7-7所示。2.JDBC身份認(rèn)證文件7-7security.sql源代碼7.3.2SpringSecurity自定義身份認(rèn)證(2)配置依賴打開chapter07項(xiàng)目的pom.xml文件,在該文件中添加JDBC的啟動(dòng)器依賴。2.JDBC身份認(rèn)證pom.xml源代碼7.3.2SpringSecurity自定義身份認(rèn)證(3)設(shè)置配置信息在項(xiàng)目chapter07中創(chuàng)建配置文件
application.yml,在該文件中設(shè)置數(shù)據(jù)庫連接的相關(guān)配置信息,具體如文件7-8所示。2.JDBC身份認(rèn)證文件7-8application.yml源代碼7.3.2SpringSecurity自定義身份認(rèn)證(4)修改配置類修改文件7-6中WebSecurityConfig配置類userDetailsService()方法,將該方法創(chuàng)建的實(shí)例對(duì)象修改為JdbcUserDetailsManager,修改后的代碼如文件7-9所示。2.JDBC身份認(rèn)證文件7-9WebSecurityConfig.java源代碼7.3.2SpringSecurity自定義身份認(rèn)證(5)效果測(cè)試重啟chapter07項(xiàng)目進(jìn)行效果測(cè)試,項(xiàng)目啟動(dòng)成功后,通過瀏覽器訪問“http://localhost:8080/”后使用錯(cuò)誤的數(shù)據(jù)庫用戶信息進(jìn)行登錄。2.JDBC身份認(rèn)證7.3.2SpringSecurity自定義身份認(rèn)證使用正確的數(shù)據(jù)庫用戶信息進(jìn)行登錄。2.JDBC身份認(rèn)證7.3.2SpringSecurity自定義身份認(rèn)證使用InMemoryUserDetailsManager和JdbcUserDetailsManager進(jìn)行身份認(rèn)證時(shí),其真正的認(rèn)證邏輯都在UserDetailsService接口重寫的loadUserByUsername()方法中。對(duì)于一個(gè)完善的項(xiàng)目來說,通常會(huì)實(shí)現(xiàn)用戶信息查詢服務(wù),對(duì)此可以自定義一個(gè)UserDetailsService實(shí)現(xiàn)類,重寫該接口的loadUserByUsername()方法,在該方法中查詢用戶信息,將查詢到的用戶信息填充到UserDetails對(duì)象返回,以實(shí)現(xiàn)用戶的身份認(rèn)證。下面通過案例對(duì)自定義UserDetailsService進(jìn)行身份驗(yàn)證的實(shí)現(xiàn)進(jìn)行演示。3.自定義UserDetailsService身份認(rèn)證7.3.2SpringSecurity自定義身份認(rèn)證(1)創(chuàng)建實(shí)體類在項(xiàng)目chapter07的java目錄下創(chuàng)建包c(diǎn)om.itheima.chapter07.entity,在該包下創(chuàng)建用戶實(shí)體類UserDto和權(quán)限實(shí)體類Privilege,具體如文件7-10和文件7-11所示。文件7-10UserDto.java文件7-11Privilege.java源代碼3.自定義UserDetailsService身份認(rèn)證7.3.2SpringSecurity自定義身份認(rèn)證(2)創(chuàng)建用戶持久層接口在項(xiàng)目chapter07的java目錄下創(chuàng)建包c(diǎn)om.itheima.chapter07.dao,在該包下創(chuàng)建用戶持久層接口,在接口中定義查詢用戶及角色信息的方法,具體如文件7-12所示。文件7-12UserDao.java源代碼3.自定義UserDetailsService身份認(rèn)證7.3.2SpringSecurity自定義身份認(rèn)證(3)封裝用戶認(rèn)證信息在項(xiàng)目chapter07的java目錄下創(chuàng)建包c(diǎn)om.itheima.chapter07.service,在該包下創(chuàng)建UserDetailsServiceImpl類,該類實(shí)現(xiàn)UserDetailsService接口,并在重寫的loadUserByUsername()方法中封裝用戶認(rèn)證信息,具體如文件7-13所示。文件7-13UserDetailsServiceImpl.java源代碼3.自定義UserDetailsService身份認(rèn)證7.3.2SpringSecurity自定義身份認(rèn)證(4)效果測(cè)試將文件7-8中的userDetailsService()方法進(jìn)行注釋,使用自定義UserDetailsService身份認(rèn)證。重啟chapter07項(xiàng)目進(jìn)行效果測(cè)試,項(xiàng)目啟動(dòng)成功后,在瀏覽器通過“http://localhost:8080/”訪問項(xiàng)目首頁后,使用錯(cuò)誤的數(shù)據(jù)庫用戶信息進(jìn)行登錄。3.自定義UserDetailsService身份認(rèn)證7.3.2SpringSecurity自定義身份認(rèn)證使用正確的數(shù)據(jù)庫用戶信息進(jìn)行登錄。3.自定義UserDetailsService身份認(rèn)證SpringSecurity授權(quán)管理7.47.4
SpringSecurity授權(quán)管理授權(quán)是SpringSecurity的核心功能之一,是根據(jù)用戶的權(quán)限來控制用戶訪問資源的過程,擁有資源的訪問權(quán)限則可正常訪問,沒有訪問的權(quán)限時(shí)則會(huì)被拒絕訪問。認(rèn)證是為了保證用戶身份的合法性,而授權(quán)則是為了更細(xì)粒度地對(duì)隱私數(shù)據(jù)進(jìn)行劃分,授權(quán)是在認(rèn)證通過后發(fā)生的,以控制不同的用戶訪問不同的資源。SpringSecurity提供了授權(quán)方法,開發(fā)者通過這些方法進(jìn)行用戶訪問控制,下面對(duì)SpringSecurity的授權(quán)流程以及自定義授權(quán)進(jìn)行講解。7.4.1SpringSecurity授權(quán)流程先定一個(gè)小目標(biāo)!
先定一個(gè)小目標(biāo)!熟悉SpringSecurity授權(quán)流程,能夠簡(jiǎn)述SpringSecurity的授權(quán)流程7.4.1SpringSecurity授權(quán)流程實(shí)現(xiàn)授權(quán)需要對(duì)用戶的訪問進(jìn)行攔截校驗(yàn),校驗(yàn)用戶的權(quán)限是否可以操作指定的資源。SpringSecurity使用標(biāo)準(zhǔn)Filter建立了對(duì)Web請(qǐng)求的攔截,最終實(shí)現(xiàn)對(duì)資源的授權(quán)訪問。7.4.1SpringSecurity授權(quán)流程①攔截請(qǐng)求。已認(rèn)證用戶訪問受保護(hù)的Web資源將被SecurityFilterChain中FilterSecurityInterceptor實(shí)例對(duì)象攔截。②獲取資源訪問策略。FilterSecurityInterceptor實(shí)例對(duì)象會(huì)通過SecurityMetadataSource的子類DefaultFilterInvocationSecurityMetadataSource實(shí)例對(duì)象中獲取要訪問當(dāng)前資源所需要的權(quán)限,權(quán)限封裝在Collection實(shí)例對(duì)象中。SecurityMetadataSource是讀取訪問策略的抽象,具體讀取的內(nèi)容,就是開發(fā)者配置的訪問規(guī)則。③FilterSecurityInterceptor通過AccessDecisionManager進(jìn)行授權(quán)決策,若決策通過,則允許訪問資源,否則將禁止訪問。AccessDecisionManager中包含一系列AccessDecisionVoter,可對(duì)當(dāng)前認(rèn)證過的身份是否有權(quán)訪問對(duì)應(yīng)的資源進(jìn)行投票,AccessDecisionManager根據(jù)投票結(jié)果做出最終決策。7.4.2SpringSecurity自定義授權(quán)先定一個(gè)小目標(biāo)!
先定一個(gè)小目標(biāo)!掌握SpringSecurity自定義授權(quán),能夠使用Web授權(quán)和方法授權(quán)實(shí)現(xiàn)用戶授權(quán)管理7.4.2SpringSecurity自定義授權(quán)SpringSecurity的底層實(shí)現(xiàn)本質(zhì)是通過多個(gè)Filter形成的過濾器鏈完成,過濾器鏈中提供了默認(rèn)的安全攔截機(jī)制,設(shè)置安全攔截規(guī)則,以控制用戶的訪問。HttpSecurity是SecurityBuilder接口的實(shí)現(xiàn)類,是HTTP安全相關(guān)的構(gòu)建器,SpringSecurity中可以通過HttpSecurity對(duì)象設(shè)置安全攔截規(guī)則,并通過該對(duì)象構(gòu)建過濾器鏈。1.Web授權(quán)根據(jù)授權(quán)的位置和形式,通??梢詫⑹跈?quán)的方式分為Web授權(quán)和方法授權(quán),這兩種授權(quán)方式都會(huì)調(diào)用AccessDecisionManager進(jìn)行授權(quán)決策。下面分別對(duì)這兩種自定義授權(quán)的方式進(jìn)行講解。7.4.2SpringSecurity自定義授權(quán)HttpSecurity可以根據(jù)不同的業(yè)務(wù)場(chǎng)景,對(duì)不同的URL采用不同的權(quán)限處理策略。當(dāng)開發(fā)者需要配置項(xiàng)目的安全攔截規(guī)則時(shí),可以調(diào)用HttpSecurity對(duì)象對(duì)應(yīng)的方法實(shí)現(xiàn)。1.Web授權(quán)方法作用authorizeRequests()開啟基于HttpServletRequest請(qǐng)求訪問的限制formLogin()開啟基于表單的用戶登錄httpBasic()開啟基于HTTP請(qǐng)求的Basic認(rèn)證登錄logout()開啟退出登錄的支持sessionManagement()開啟Session管理配置rememberMe()開啟“記住我”功能csrf()配置CSRF跨站請(qǐng)求偽造防護(hù)功能HttpSecurity類的常用方法7.4.2SpringSecurity自定義授權(quán)通過authorizeRequests()方法可以添加用戶請(qǐng)求控制的規(guī)則,這些規(guī)則通過用戶請(qǐng)求控制的相關(guān)方法指定。1.Web授權(quán)用戶請(qǐng)求控制的常用方法方法作用antMatchers(String...antPatterns)開啟Ant風(fēng)格的路徑匹配mvcMatchers(String...patterns)開啟MVC風(fēng)格的路徑匹配,與Ant風(fēng)格類似regexMatchers(String...regexPatterns)開啟正則表達(dá)式的路徑匹配and()功能連接符anyRequest()匹配任何請(qǐng)求rememberMe()開啟“記住我”功能access(Stringattribute)使用基于SpEL表達(dá)式的角色進(jìn)行匹配7.4.2SpringSecurity自定義授權(quán)1.Web授權(quán)用戶請(qǐng)求控制的常用方法方法作用hasAnyRole(String...roles)匹配用戶是否有參數(shù)中的任意角色hasRole(Stringrole)匹配用戶是否有某一個(gè)角色hasAnyAuthority(String...authorities)匹配用戶是否有參數(shù)中的任意權(quán)限hasAuthority(Stringauthority)匹配用戶是否有某一個(gè)權(quán)限authenticated()匹配已經(jīng)登錄認(rèn)證的用戶fullyAuthenticated()匹配完整登錄認(rèn)證的用戶(非rememberMe登錄用戶)hasIpAddress(StringipaddressExpression)匹配某IP地址的訪問請(qǐng)求permitAll()無條件對(duì)請(qǐng)求進(jìn)行放行7.4.2SpringSecurity自定義授權(quán)1.Web授權(quán)基于表單的身份驗(yàn)證的常見方法通過HttpSecurity類的formLogin()方法開啟基于表單的用戶登錄后,可以指定表單認(rèn)證的相關(guān)設(shè)置。方法作用loginPage(StringloginPage)指定自定義登錄界面,不使用SpringSecurity默認(rèn)登錄界面loginProcessingUrl(StringloginProcessingUrl)指定處理登錄的請(qǐng)求url,為表單提交用戶信息的ActionsuccessForwardUrl(StringforwardUrl)指定登錄成功后默認(rèn)跳轉(zhuǎn)的路徑7.4.2SpringSecurity自定義授權(quán)下面通過案例演示在SpringBoot項(xiàng)目中使用SpringSecurity的Web授權(quán)方式進(jìn)行權(quán)限管理。1.Web授權(quán)(1)導(dǎo)入登錄頁面在項(xiàng)目chapter07的resources目錄的templates文件夾中導(dǎo)入自定義的登錄頁面。文件7-14login.html源代碼7.4.2SpringSecurity自定義授權(quán)1.Web授權(quán)(2)編輯配置類在項(xiàng)目chapter07的WebSecurityConfig配置類中使用HttpSecurity對(duì)象設(shè)置安全攔截規(guī)則,并創(chuàng)建SecurityFilterChain對(duì)象交由Spring管理,具體代碼如文件7-15所示。文件7-15WebSecurityConfig.java源代碼7.4.2SpringSecurity自定義授權(quán)1.Web授權(quán)(2)編輯配置類文件7-5的WebMvcConfig配置類中添加loginview的視圖映射,具體代碼如文件7-16所示。文件7-16WebMvcConfig.java源代碼7.4.2SpringSecurity自定義授權(quán)1.Web授權(quán)(3)測(cè)試效果啟動(dòng)項(xiàng)目chapter07,在瀏覽器中通過“http://localhost:8080/”訪問項(xiàng)目首頁。7.4.2SpringSecurity自定義授權(quán)1.Web授權(quán)在登錄頁面使用zhangsan的用戶信息進(jìn)行登錄。7.4.2SpringSecurity自定義授權(quán)1.Web授權(quán)圖書管理需要角色為ROLE_ADMIN的用戶才可以訪問,用戶zhangsan的角色為ROLE_COMMON,在后臺(tái)首頁單擊“圖書管理”鏈接。7.4.2SpringSecurity自定義授權(quán)1.Web授權(quán)使用用戶lisi進(jìn)行登錄,lisi對(duì)應(yīng)的角色為ROLE_ADMIN,登錄成功再次訪問“圖書管理”。7.4.2SpringSecurity自定義授權(quán)2.方法授權(quán)SpringSecurity除了可以在配置類中通過創(chuàng)建過濾器鏈設(shè)置安全攔截規(guī)則外,還可以使用@Secured、@RolesAllowed和@PreAuthorize注解控制類中所有方法或者單獨(dú)某個(gè)方法的訪問權(quán)限,以實(shí)現(xiàn)對(duì)訪問進(jìn)行授權(quán)管理。7.4.2SpringSecurity自定義授權(quán)2.方法授權(quán)使用@Secured和@RolesAllowed注解時(shí),只需在注解中指定訪問當(dāng)前注解標(biāo)注的類或方法所需要具有的角色,允許多個(gè)角色訪問時(shí),使用大括號(hào)對(duì)角色信息進(jìn)行包裹,角色信息之間使用分號(hào)分隔即可。@RequestMapping("list")@Secured({"ROLE_ADMIN","ROLE_COMMON"})publicStringfindList(){return"book_list";}@RequestMapping("admin/manag")@RolesAllowed("ROLE_ADMIN")publicStringfindManagList(){return"book_manag";}7.4.2SpringSecurity自定義授權(quán)2.方法授權(quán)@PreAuthorize注解會(huì)在方法執(zhí)行前進(jìn)行權(quán)限驗(yàn)證,支持SpEL表達(dá)式。@RequestMapping("list")@PreAuthorize("hasAnyRole('ROLE_ADMIN','ROLE_COMMON')")publicStringfindList(){return"book_list";}@RequestMapping("admin/manag")@PreAuthorize("hasRole('ROLE_ADMIN')")publicStringfindManagList(){return"book_manag";}7.4.2SpringSecurity自定義授權(quán)2.方法授權(quán)@Secured、@RolesAllowed和@PreAuthorize注解都可以對(duì)方法的訪問進(jìn)行權(quán)限控制。@Secured為SpringSecurity提供的注解。@RolesAllowed為基于JSR250規(guī)范的注解。@PreAuthorize支持SpEL表達(dá)式。7.4.2SpringSecurity自定義授權(quán)2.方法授權(quán)SpringSecurity默認(rèn)是禁用方法級(jí)別的安全控制注解,要想使用注解進(jìn)行方法授權(quán),可以使用@EnableGlobalMethodSecurity注解開啟基于方法的安全認(rèn)證機(jī)制,該注解可以標(biāo)注在任意配置類上。@Configuration@EnableGlobalMethodSecurity(securedEnabled=true,jsr250Enabled=true,prePostEnabled=true)publicclassWebSecurityConfig{……}7.4.2SpringSecurity自定義授權(quán)2.方法授權(quán)(1)開啟基于方法的安全認(rèn)證機(jī)制在項(xiàng)目chapter07的WebSecurityConfig配置類中開啟基于方法的安全認(rèn)證機(jī)制,并將類中HttpSecurity對(duì)象設(shè)置的訪問“圖書管理”攔截規(guī)則刪除,以確保對(duì)資源授權(quán)地為方法授權(quán),修改后的代碼如文件7-17所示。文件7-17WebSecurityConfig.java源代碼7.4.2SpringSecurity自定義授權(quán)2.方法授權(quán)(2)方法授權(quán)在文件7-4BookController類的findManagList()方法上使用注解指定訪問該方法所需的角色,具體如文件7-18所示。文件7-18BookController.java源代碼7.4.2SpringSecurity自定義授權(quán)2.方法授權(quán)(3)測(cè)試效果啟動(dòng)項(xiàng)目chapter07,在瀏覽器中通過“http://localhost:8080/”訪問項(xiàng)目首頁后,使用用戶zhangsan登錄系統(tǒng)。7.4.2SpringSecurity自定義授權(quán)2.方法授權(quán)單擊左側(cè)的“圖書管理”鏈接。7.4.2SpringSecurity自定義授權(quán)2.方法授權(quán)在用戶登錄頁面使用用戶lisi進(jìn)行登錄,登錄成功后再次訪問“圖書管理”。7.4.3動(dòng)態(tài)展示菜單先定一個(gè)小目標(biāo)!
先定一個(gè)小目標(biāo)!掌握動(dòng)態(tài)展示菜單,能夠通過SpringSecurity的授權(quán)管理實(shí)現(xiàn)動(dòng)態(tài)展示菜單7.4.3動(dòng)態(tài)展示菜單在前面的講解中,只是通過SpringSecurity對(duì)后臺(tái)資源的訪問根據(jù)角色進(jìn)行權(quán)限控制,前端頁面并沒有做任何處理,不同角色能看到的前端頁面是一樣的,即使當(dāng)前用戶沒有對(duì)應(yīng)的訪問權(quán)限,依然能看到對(duì)應(yīng)的菜單,用戶體驗(yàn)較差。下面在前面案例的基礎(chǔ)上,講解如何使用SpringSecurity與Thymeleaf整合實(shí)現(xiàn)前端頁面根據(jù)登錄用戶的角色動(dòng)態(tài)展示菜單。7.4.3動(dòng)態(tài)展示菜單在chapter07項(xiàng)目的pom.xml文件中添加Thymeleaf與SpringSecurity5的集成包:thymeleaf-extras-springsecurity5。pom.xml源代碼1.添加依賴7.4.3動(dòng)態(tài)展示菜單打開chapter07項(xiàng)目后臺(tái)首頁main.html,引入SpringSecurity安全標(biāo)簽,并在頁面中根據(jù)需求使用SpringSecurity標(biāo)簽指定為不同角色顯示不同的頁面內(nèi)容,實(shí)現(xiàn)動(dòng)態(tài)展示控制,具體如文件7-19所示。文件7-19main.html源代碼2.修改頁面代碼7.4.3動(dòng)態(tài)展示菜單重啟chapter07項(xiàng)目進(jìn)行效果測(cè)試,項(xiàng)目啟動(dòng)后,使用用戶zhangsan的信息進(jìn)行登錄,登錄后展示后臺(tái)首頁。3.效果測(cè)試7.4.3動(dòng)態(tài)展示菜單使用用戶lisi的信息進(jìn)行登錄,登錄后展示后臺(tái)首頁。3.效果測(cè)試SpringSecurity會(huì)話管理和用戶退出7.57.5
SpringSecurity會(huì)話管理和用戶退出用戶認(rèn)證通過后,為了避免用戶的每次操作都進(jìn)行認(rèn)證,可以將用戶的信息保存在會(huì)話中。會(huì)話就是系統(tǒng)為了保持當(dāng)前用戶的登錄狀態(tài)所提供的機(jī)制,常見的有基于Session方式、基于Token方式等。SpringSecurity提供會(huì)話管理功能,只需要配置即可使用。同時(shí),如果想結(jié)束當(dāng)前會(huì)話,可以在自定義退出功能中銷毀會(huì)話中的用戶信息。下面將在SpringBoot項(xiàng)目中基于SpringSecurity實(shí)現(xiàn)會(huì)話管理和用戶退出。7.5.1會(huì)話管理先定一個(gè)小目標(biāo)!
先定一個(gè)小目標(biāo)!掌握SpringSecurity會(huì)話管理,能夠在SpringSecurity中獲取認(rèn)證后的用戶信息,以及進(jìn)行會(huì)話控制7.5.1會(huì)話管理SpringSecurity對(duì)用戶信息認(rèn)證通過后,會(huì)將用戶信息存入SpringSecurity應(yīng)用的上下文對(duì)象SecurityContext中,SecurityContext與當(dāng)前線程進(jìn)行綁定,需要獲取用戶信息時(shí),可以通過SecurityContextHolder獲取SecurityContext對(duì)象,進(jìn)而使用SecurityContext對(duì)象獲取用戶信息。Authenticationauthentication=
SecurityContextHolder.getContext().getAuthentication();if(!authentication.isAuthenticated()){returnnull;}UserDetailsuserDetails=(UserDetails)authentication.getPrincipal();Stringusername=userDetails.getUsername();1.獲取用戶信息7.5.1會(huì)話管理默認(rèn)情況下,SpringSecurity會(huì)為每個(gè)登錄成功的用戶新建一個(gè)Session對(duì)象進(jìn)行會(huì)話管理,開發(fā)者也可以根據(jù)具體的需求對(duì)Session的創(chuàng)建進(jìn)行控制。SpringSecurity管理Session的創(chuàng)建策略有以下四種。always:如果沒有Session就創(chuàng)建一個(gè)。ifRequired:如果需要就創(chuàng)建一個(gè)Session,是默認(rèn)的創(chuàng)建策略。never:Spring
Security將不會(huì)創(chuàng)建Session,但是如果項(xiàng)目中其他地方創(chuàng)建了Session,那么SpringSecurity可以使用它。stateless:Spring
Security將絕對(duì)不會(huì)創(chuàng)建Session,也不使用Session。2.會(huì)話控制7.5.1會(huì)話管理2.會(huì)話控制當(dāng)項(xiàng)目中不想自動(dòng)創(chuàng)建Session,但是想要使用項(xiàng)目中其他地方創(chuàng)建的Session時(shí),可以選擇使用never策略。@BeanpublicSecurityFilterChainsecurityFilterChain(HttpSecurityhttp)throwsException{http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.NEVER);returnhttp.build();}7.5.1會(huì)話管理2.會(huì)話控制SpringSecurity對(duì)用戶信息認(rèn)證通過后,會(huì)將用戶信息存入SpringSecurity應(yīng)用的上下文對(duì)象如果項(xiàng)目中允許創(chuàng)建Session,默認(rèn)情況下Session的超時(shí)時(shí)間為30分鐘,如果想要對(duì)Session默認(rèn)的超時(shí)時(shí)間進(jìn)行修改,可以在SpringBoot的配置文件中設(shè)置Session的超時(shí)時(shí)間。server:servlet:session:timeout:86400s7.5.2用戶退出先定一個(gè)小目標(biāo)!
先定一個(gè)小目標(biāo)!掌握SpringSecurity用戶退出,能夠在SpringBoot項(xiàng)目中實(shí)現(xiàn)使用SpringSecurity實(shí)現(xiàn)用戶退出7.5.2用戶退出Springsecurity默認(rèn)實(shí)現(xiàn)了用戶退出的功能,用戶退出主要考慮退出后會(huì)話如何管理以及跳轉(zhuǎn)到哪個(gè)頁面。HttpSecurity類提供了logout()方法開啟退出登錄的支持,默認(rèn)觸發(fā)用戶退出操作的URL為“/logout”,用戶退出時(shí)同時(shí)也會(huì)清除Session等默認(rèn)用戶配置。用戶退出登錄的邏輯是由過濾器LogoutFilter執(zhí)行的,但是項(xiàng)目開發(fā)時(shí)一般不會(huì)選擇直接操作??LogoutFilter,而是通過LogoutConfigurer對(duì)LogoutFilter進(jìn)行配置,HttpSecurity類logout()方法的返回值就是一個(gè)LogoutConfigurer對(duì)象,該對(duì)象提供了一系列設(shè)置用戶退出的方法。7.5.2用戶退出用戶退出的主要方法方法作用logoutUrl(StringlogoutUrl)用戶退出處理控制URL,默認(rèn)為post請(qǐng)求的/logoutlogoutSuccessUrl(StringlogoutSuccessUrl)用戶退出成功后的重定向地址logoutSuccessHandler(LogoutSuccessHandlerlogoutSuccessHandler)用戶退出成功后的處理器設(shè)置deleteCookies(String...cookieNamesToClear)用戶退出后刪除指定CookieinvalidateHttpSession(booleaninvalidateHttpSession)用戶退出后是否立即清除Session,默認(rèn)為trueclearAuthentication(booleanclearAuthentication)用戶退出后是否立即清除Authentication用戶認(rèn)證信息,默認(rèn)為true7.5.2用戶退出下面通過案例演示用戶退出的實(shí)現(xiàn)。1.設(shè)置用戶退出的請(qǐng)求路徑項(xiàng)目后臺(tái)首頁main.html右上方有一個(gè)“注銷”菜單,可以在該菜單中設(shè)置用戶退出的請(qǐng)求路徑,具體如文件7-20所示。文件7-20main.html源代碼7.5.2用戶退出2.效果測(cè)試重啟chapter07項(xiàng)目進(jìn)行效果測(cè)試,項(xiàng)目啟動(dòng)成功后,使用正確的用戶信息登錄后進(jìn)入后臺(tái)首頁,單擊后臺(tái)首頁頁面右上角的“注銷”。本章小結(jié)本章主要對(duì)SpringBoot項(xiàng)目中的安全管理進(jìn)行了講解。首先講解了安全框架概述;然后講解了SpringSecurity基礎(chǔ)入門;接著講解了SpringSecurity認(rèn)證管理和授權(quán)管理;最后對(duì)SpringSecurity會(huì)話管理和用戶退出進(jìn)行了講解。通過本章的學(xué)習(xí),希望大家可以在SpringBoot項(xiàng)目中正確使用SpringSecurity進(jìn)行安全管理。本章小結(jié)第8章SpringBoot消息服務(wù)《SpringBoot企業(yè)級(jí)開發(fā)教程(第2版)》學(xué)習(xí)目標(biāo)/Target熟悉常見消息中間件,能夠說出4種常見的消息中間件名稱和特點(diǎn)熟悉使用消息服務(wù)的好處,能夠通過不同的場(chǎng)景說出使用消息服務(wù)的好處了解RabbitMQ簡(jiǎn)介,能夠說出RabbitMQ消息代理流程熟悉RabbitMQ工作模式,能夠說出RabbitMQ支持的工作模式,以及每種模式的工作原理掌握RabbitMQ的下載、安裝和配置,能夠在Windows平臺(tái)安裝和配置RabbitMQ,并成功啟動(dòng)RabbitMQ學(xué)習(xí)目標(biāo)/Target掌握RabbitMQ入門案例,能夠獨(dú)立實(shí)現(xiàn)RabbitMQ入門案例掌握SpringBoot整合RabbitMQ環(huán)境搭建,能夠在SpringBoot項(xiàng)目中整合RabbitMQ掌握使用Routing模式實(shí)現(xiàn)消息服務(wù),能夠在SpringBoot項(xiàng)目中使用Routing模式實(shí)現(xiàn)消息服務(wù)掌握使用Topics模式實(shí)現(xiàn)消息服務(wù),能夠在SpringBoot項(xiàng)目中使用Topics模式實(shí)現(xiàn)消息服務(wù)掌握使用Publish/Subscribe模式實(shí)現(xiàn)消息服務(wù),能夠在SpringBoot項(xiàng)目中使用Publish/Subscribe模式實(shí)現(xiàn)消息服務(wù)章節(jié)概述/Summary在實(shí)際項(xiàng)目開發(fā)中,有時(shí)候需要與其他系統(tǒng)進(jìn)行集成完成相關(guān)業(yè)務(wù)功能,這種情況最原始的做法是程序內(nèi)部相互調(diào)用,除此之外,還可以使用消息服務(wù)中間件進(jìn)行業(yè)務(wù)處理,使用消息服務(wù)中間件處理業(yè)務(wù)能夠提升系統(tǒng)的異步通信和擴(kuò)展解耦能力。SpringBoot對(duì)消息服務(wù)管理提供了非常好的支持,下面將對(duì)SpringBoot消息服務(wù)的原理和整合使用進(jìn)行詳細(xì)講解。目錄/Contents8.18.2消息服務(wù)概述RabbitMQ快速入門8.3SpringBoot與RabbitMQ整合實(shí)現(xiàn)消息服務(wù)概述8.18.1
消息服務(wù)概述Java中的消息服務(wù)是指不同應(yīng)用程序之間或同一個(gè)應(yīng)用程序的不同組件之間通信的API,包括創(chuàng)建、發(fā)送、讀取消息等,用于支持JAVA應(yīng)用程序開發(fā)。在J2EE中,當(dāng)兩個(gè)組件使用Java消息服務(wù)進(jìn)行通信時(shí),發(fā)送消息的組件通常稱為消息生產(chǎn)者,使用發(fā)送過來的數(shù)據(jù)的組件稱為消息消費(fèi)者,消息生產(chǎn)者與消息消費(fèi)者之間并不是直接相連,而是通過一個(gè)共同的消息收發(fā)服務(wù)連接起來,消息生產(chǎn)者和消息消費(fèi)者雙方無須相互了解消息服務(wù)的實(shí)現(xiàn)細(xì)節(jié),只需了解交換消息的格式即可。消息服務(wù)這種機(jī)制實(shí)現(xiàn)了組件之間的解耦,因此更加靈活。下面對(duì)常用消息中間件以及使用消息服務(wù)的優(yōu)勢(shì)進(jìn)行講解。8.1.1常用消息中間件先定一個(gè)小目標(biāo)!
先定一個(gè)小目標(biāo)!熟悉常見消息中間件,能夠說出4種常見的消息中間件名稱和特點(diǎn)8.1.1常用消息中間件消息隊(duì)列(MessageQueue,MQ)是一種能實(shí)現(xiàn)消息生產(chǎn)者到消息消費(fèi)者單向通信的通信模型,通常將實(shí)現(xiàn)了這個(gè)模型的組件稱為消息隊(duì)列中間件(簡(jiǎn)稱消息中間件)。消息中間件通過高效可靠的消息傳遞機(jī)制進(jìn)行與平臺(tái)無關(guān)的數(shù)據(jù)交流,并基于數(shù)據(jù)通信來進(jìn)行分布式系統(tǒng)的集成。目前開源的消息中間件可謂是琳瑯滿目,能讓大家耳熟能詳?shù)挠泻芏?,例如ActiveMQ、RabbitMQ、Kafka、RocketMQ等,也有直接使用Redis充當(dāng)消息隊(duì)列的案例,而這些消息中間件各有側(cè)重,在實(shí)際選型時(shí),需要結(jié)合具體需求來選擇。下面對(duì)常用的消息中間件進(jìn)行介紹。8.1.1常用消息中間件1.ActiveMQActiveMQ是采用Java語言編寫的完全基于Java消息服務(wù)(JavaMessageService,JMS)規(guī)范的面向消息的中間件,它為應(yīng)用程序提供高效、可擴(kuò)展的、穩(wěn)定的、安全的企業(yè)級(jí)消息通信。ActiveMQ豐富的API和多種集群構(gòu)建模式使其成為業(yè)界老牌的消息中間件,在中小型企業(yè)中應(yīng)用廣泛。相較于后續(xù)出現(xiàn)的RabbitMQ、RocketMQ、Kafka等消息中間件來說,ActiveMQ性能相對(duì)較弱,在如今的高并發(fā)、大數(shù)據(jù)處理的場(chǎng)景下顯得力不從心,經(jīng)常會(huì)出現(xiàn)一些問題,例如消息延遲、堆積、堵塞等。8.1.1常用消息中間件2.RabbitMQRabbitMQ是使用Erlang語言開發(fā)的開源消息隊(duì)列系統(tǒng),支持高級(jí)消息隊(duì)列協(xié)議(AdvancedMessageQueuingProtocol,AMQP,可擴(kuò)展通訊和表示協(xié)議,ExtensibleMessagingandPresenceProtocol,XMPP)等。AMQP是應(yīng)對(duì)大規(guī)模并發(fā)活動(dòng)提供統(tǒng)一消息服務(wù)的應(yīng)用層標(biāo)準(zhǔn)高級(jí)消息隊(duì)列協(xié)議,專為面向消息的中間件設(shè)計(jì),該協(xié)議更多用在企業(yè)系統(tǒng)內(nèi)對(duì)數(shù)據(jù)一致性、穩(wěn)定性和可靠性要求很高的場(chǎng)景,對(duì)性能和吞吐量的要求不是很高。RabbitMQ具有并發(fā)能力強(qiáng)、性能好、消息延遲低、社區(qū)活躍、管理界面豐富等特性,使得其在應(yīng)用開發(fā)中越來越受歡迎。8.1.1常用消息中間件3.KafkaKafka是它是一種采用Scala和Java語言編寫的高吞吐量分布式發(fā)布訂閱消息系統(tǒng),提供了快速的、可擴(kuò)展的、分布式的、分區(qū)的和可復(fù)制的日志訂閱服務(wù),其主要特點(diǎn)是追求高吞吐量,適用于會(huì)產(chǎn)生大量數(shù)據(jù)的互聯(lián)網(wǎng)服務(wù)的數(shù)據(jù)收集業(yè)務(wù)。8.1.1常用消息中間件4.RocketMQRocketMQ使用純Java語言編寫,具有高吞吐量、高可用性、適合大規(guī)模分布式系統(tǒng)應(yīng)用的特點(diǎn)。RocketMQ的思路起源于Kafka,對(duì)消息的可靠傳輸和事務(wù)性做了優(yōu)化,目前被廣泛應(yīng)用于交易、充值、流計(jì)算、消息推送、日志流式處理場(chǎng)景。8.1.2
使用消息服務(wù)的好處先定一個(gè)小目標(biāo)!
先定一個(gè)小目標(biāo)!熟悉使用消息服務(wù)的好處,能夠通過不同的場(chǎng)景說出使用消息服務(wù)的好處8.1.2
使用消息服務(wù)的好處在多數(shù)應(yīng)用尤其是分布式系統(tǒng)中,消息服務(wù)是不可或缺的重要部分,它使用起來比較簡(jiǎn)單,同時(shí)解決了不少難題,例如應(yīng)用解耦、異步提速、流量削峰、分布式事務(wù)管理等,使用消息服務(wù)可以實(shí)現(xiàn)一個(gè)高性能、高可用、高擴(kuò)展的系統(tǒng)。下面使用實(shí)際開發(fā)中的若干場(chǎng)景來分析和說明使用消息服務(wù)的好處。8.1.2
使用消息服務(wù)的好處1.應(yīng)用解耦8.1.2
使用消息服務(wù)的好處2.異步提速8.1.2
使用消息服務(wù)的好處3.流量削峰8.1.2
使用消息服務(wù)的好處4.分布式事務(wù)管理RabbitMQ快速入門8.28.2.1
RabbitMQ簡(jiǎn)介先定一個(gè)小目標(biāo)!
先定一個(gè)小目標(biāo)!了解RabbitMQ簡(jiǎn)介,能夠說出RabbitMQ消息代理流程8.2.1
RabbitMQ簡(jiǎn)介AMQP是一種與平臺(tái)無關(guān)的線路級(jí)的消息中間件協(xié)議,其通過制定協(xié)議來統(tǒng)一數(shù)據(jù)交互的格式。AMQP是跨語言的,它只制定協(xié)議,不規(guī)定實(shí)現(xiàn)語言和實(shí)現(xiàn)方式。RabbitMQ是基于AMQP標(biāo)準(zhǔn),使用Erlang語言開發(fā)的消息中間件,在SpirngBoot中對(duì)RabbitMQ進(jìn)行了集成管理。8.2.1
RabbitMQ簡(jiǎn)介在所有的消息服務(wù)中,消息中間件都會(huì)作為一個(gè)第三方消息代理,接收發(fā)布者發(fā)布的消息,并推送給消息消費(fèi)者。8.2.1
RabbitMQ簡(jiǎn)介Connection:代表客戶端(包括消息生產(chǎn)者和消息消費(fèi)者)與RabbitMQ之間的連接。Channel:消息通道,位于連接內(nèi)部,負(fù)責(zé)實(shí)際的通信。在客戶端的每個(gè)連接里,可建立多個(gè)Channel。Broker:表示消息隊(duì)列服務(wù)器實(shí)體,Broker會(huì)維護(hù)從消息生產(chǎn)者到消息消費(fèi)者的路線,保證數(shù)據(jù)能按照指定的方式進(jìn)行傳輸。VirtualHost:虛擬主機(jī),包含交換機(jī)、消息隊(duì)列等對(duì)象。Exchange:交換機(jī),用于接收消息生產(chǎn)者發(fā)送的消息,并根據(jù)分發(fā)規(guī)則將這些消息路由給服務(wù)器中的隊(duì)列。Queue:隊(duì)列,是消息的載體,每個(gè)消息都會(huì)被投到一個(gè)或多個(gè)隊(duì)列中,等待消息消費(fèi)者連接到這個(gè)隊(duì)列將其取走。Binding:交換機(jī)和消息隊(duì)列之間的虛擬連接。8.2.1
RabbitMQ簡(jiǎn)介RabbitMQ消息代理流程如下。消息生產(chǎn)者(發(fā)送消息的程序)和消息隊(duì)列服務(wù)器實(shí)體建立連接后,向指定的虛擬主機(jī)發(fā)送消息。虛擬主機(jī)內(nèi)部的交換機(jī)接收消息生產(chǎn)者發(fā)送過來的消息,并將消息傳遞并存儲(chǔ)到與之綁定的消息隊(duì)列中。消息消費(fèi)者(等待接收消息的程序)通過網(wǎng)絡(luò)連接與消息隊(duì)列服務(wù)器實(shí)體建立連接,在連接內(nèi)部使用消息通道進(jìn)行消息的最終消費(fèi)。8.2.2
RabbitMQ工作模式先定一個(gè)小目標(biāo)!
先定一個(gè)小目標(biāo)!熟悉RabbitMQ工作模式,能夠說出RabbitMQ支持的工作模式,以及每種模式的工作原理8.2.2
RabbitMQ工作模式1.簡(jiǎn)單模式RabbitMQ是一個(gè)消息代理,它接收和轉(zhuǎn)發(fā)消息,RabbitMQ的簡(jiǎn)單模式不用聲明交換機(jī),只需要定義一個(gè)隊(duì)列,消息生產(chǎn)者會(huì)將消息交給默認(rèn)的交換機(jī),默認(rèn)的交換機(jī)將獲取到的信息綁定到消息生產(chǎn)者對(duì)應(yīng)的隊(duì)列,消息消費(fèi)者監(jiān)聽這個(gè)隊(duì)列,當(dāng)隊(duì)列中有消息時(shí),消息消費(fèi)者執(zhí)行消息消費(fèi)。8.2.2
RabbitMQ工作模式2.WorkQueuesWorkQueues模式即工作隊(duì)列模式,在WorkQueues模式中,同樣不需要設(shè)置交換機(jī),RabbitMQ會(huì)使用內(nèi)部默認(rèn)交換機(jī)進(jìn)行消息轉(zhuǎn)換,只需要指定唯一的消息隊(duì)列進(jìn)行消息傳遞。WorkQueues模式和簡(jiǎn)單模式的主要區(qū)別在于,WorkQueues模式可以有多個(gè)消息消費(fèi)者。在這種模式下,多個(gè)消息消費(fèi)者通過輪詢的方式依次接收消息隊(duì)列中存儲(chǔ)的消息,一旦消息被某一個(gè)消息消費(fèi)者接收,消息隊(duì)列會(huì)將消息移除,而接收并處理消息的消費(fèi)者必須在消費(fèi)完一條消息后再準(zhǔn)備接收下一條消息。8.2.2
RabbitMQ工作模式3.Publish/SubscribePublish/Subscribe模式即發(fā)布/訂閱模式,在Publish/Subscribe模式中,必須先顯式配置一個(gè)fanout類型的交換機(jī),消息生產(chǎn)者將消息發(fā)送到交換機(jī),同時(shí)會(huì)將消息路由到每一個(gè)消息隊(duì)列上,然后每個(gè)消息隊(duì)列都可以對(duì)相同的消息進(jìn)行接收和存儲(chǔ),進(jìn)而由各自消息隊(duì)列關(guān)聯(lián)的消費(fèi)者進(jìn)行消費(fèi)。8.2.2
RabbitMQ工作模式4.RoutingRouting模式即路由模式,在Routing模式中,必須先配置一個(gè)direct類型的交換機(jī),并指定一個(gè)RoutingKey。隊(duì)列與交換機(jī)的綁定也需要指定一個(gè)RoutingKey,發(fā)送消息時(shí)交換機(jī)不再把消息交給每一個(gè)綁定的隊(duì)列,而是根據(jù)消息的RoutingKey進(jìn)行判斷,只有隊(duì)列的RoutingKey與消息的RoutingKey完全一致時(shí),才會(huì)接收到消息,最后由消息消費(fèi)者進(jìn)行消費(fèi)。8.2.2
RabbitMQ工作模式5.Topics(通配符模式)Topics模式即通配符模式,在Topics模式中必須先配置一個(gè)topic類型的交換機(jī),并指定不同的Routingkey,根據(jù)Routingkey將對(duì)應(yīng)的消息從交換機(jī)路由到不同的消息隊(duì)列進(jìn)行存儲(chǔ),然后由消息消費(fèi)者進(jìn)行消費(fèi)。Topics模式與Routing模式的主要不同在于,Topics模式設(shè)置的路由鍵包含通配符。其中,“#”用于匹配多個(gè)字符,“*”用于匹配一個(gè)字符,然后與其他字符一起用“.”進(jìn)行連接。8.2.2
RabbitMQ工作模式6.RPCRPC模式與WorkQueues模式主體流程相似,都不需要設(shè)置交換機(jī),只需要指定唯一的消息隊(duì)列進(jìn)行消息傳遞。RPC模式與WorkQueues模式的主要不同在于,RPC模式是一個(gè)回環(huán)結(jié)構(gòu),主要對(duì)分布式架構(gòu)的消息傳遞業(yè)務(wù),客戶端(Client)先發(fā)送消息到消息隊(duì)列,遠(yuǎn)程服務(wù)端(Server)獲取消息,然后再寫入另一個(gè)消息隊(duì)列,向原始客戶端(Client)響應(yīng)消息處理結(jié)果。8.2.2
RabbitMQ工作模式7.PublisherConfirmsPublisherConfirms模式即發(fā)布者確認(rèn)模式,是AMQP0.9.1協(xié)議的RabbitMQ擴(kuò)展,默認(rèn)情況下不啟用,發(fā)布者在通道上啟用發(fā)布者確認(rèn)后,代理將異步確認(rèn)客戶端發(fā)布的消息。PublisherConfirms模式最大的好處在于它是異步的,一旦發(fā)布一條消息,消息生產(chǎn)者就可以在等信道返回確認(rèn)的同時(shí)繼續(xù)發(fā)送下一條消息,當(dāng)消息最終得到確認(rèn)之后,消息生產(chǎn)者應(yīng)用便可以通過回調(diào)方法來處理該確認(rèn)消息。8.2.3
RabbitMQ的下載、安裝和配置先定一個(gè)小目標(biāo)!
先定一個(gè)小目標(biāo)!掌握RabbitMQ的下載、安裝和配置,能夠在Windows平臺(tái)安裝和配置RabbitMQ,并成功啟動(dòng)RabbitMQ8.2.3
RabbitMQ的下載、安裝和配置1.RabbitMQ下載在RabbitMQ官網(wǎng)首頁的GetStarted版塊中單擊“Download+Installation”按鈕進(jìn)入RabbitMQ的下載頁面。8.2.3
RabbitMQ的下載、安裝和配置1.RabbitMQ下載在RabbitMQ的下載頁面單擊“ChocolateyorInstaller”超鏈接,進(jìn)入基于Windows平臺(tái)的安裝包下載頁面。8.2.3
RabbitMQ的下載、安裝和配置2.RabbitMQ安裝和配置RabbitMQ是使用Erlang語言開發(fā)的,安裝RabbitMQ之前需要先安裝Erlang語言包。RabbitMQ3.11.5需要Erlang的最小版本為25.0,最大版本為25.1。RabbitMQ安裝包和Erlang語言包的安裝都非常簡(jiǎn)單,只需要雙擊下載的安裝文件進(jìn)行安裝,然后“下一步”、“安裝”即可完成,在此就不對(duì)安裝過程進(jìn)行講解。8.2.3
RabbitMQ的下載、安裝和配置2.RabbitMQ安裝和配置完成Erlang和RabbitMQ的安裝后,進(jìn)一步對(duì)RabbitMQ的啟動(dòng)進(jìn)行配置,具體步驟如下。(1)配置環(huán)境變量在Path系統(tǒng)變量中添加值“%ERLANG_HOME%\bin;”就可以將Erlang的bin路徑添加到Path系統(tǒng)變量中。為了確保Erlang安裝成功,并且環(huán)境變量設(shè)置成功,在CMD窗口中任意路徑下輸入erl命令進(jìn)行驗(yàn)證。8.2.3
RabbitMQ的下載、安裝和配置2.RabbitMQ安裝和配置(2)啟動(dòng)插件編輯完環(huán)境變量后,在CMD窗口中進(jìn)入RabbitmQ的sbin目錄,通過命令啟動(dòng)RabbitMQ的插件。rabbitmq-pluginsenablerabbitmq_management8.2.3
RabbitMQ的下載、安裝和配置2.RabbitMQ安裝和配置(3)啟動(dòng)RabbitMQ進(jìn)入RabbitmQ的sbin目錄,雙擊“rabbitmq-server.bat”文件啟動(dòng)RabbitMQ服務(wù),此時(shí)會(huì)彈出CMD窗口顯示啟動(dòng)情況。8.2.3
RabbitMQ的下載、安裝和配置2.RabbitMQ安裝和配置RabbitMQ安裝過程中默認(rèn)提供了用戶名和密碼均為guest的用戶,可以使用該賬戶進(jìn)行登錄。8.2.4
RabbitMQ入門案例先定一個(gè)小目標(biāo)!
先定一個(gè)小目標(biāo)!掌握RabbitM
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 兩位好友合作經(jīng)營(yíng)店鋪合同模板
- 個(gè)人與個(gè)人借款合同范本
- 中外合資企業(yè)采購合同中英文對(duì)照
- 中外合資經(jīng)營(yíng)企業(yè)合同(適用于零售連鎖業(yè)務(wù))
- 個(gè)人二手房交易合同擔(dān)保協(xié)議書
- 專利交易合同協(xié)議
- 個(gè)人向企業(yè)借款合同樣板
- 個(gè)人與公司合作承包項(xiàng)目合同
- 專業(yè)帶小孩勞動(dòng)合同范本
- 個(gè)人向企業(yè)借款合同示例
- 2025集團(tuán)公司內(nèi)部借款合同范本
- 2023高考語文文言文復(fù)習(xí):《說苑》練習(xí)題(含答案解析)
- 老人心理特征和溝通技巧
- 幼兒阿拉伯?dāng)?shù)字描紅(0-100)打印版
- 標(biāo)桿地產(chǎn)集團(tuán) 研發(fā)設(shè)計(jì) 工程管理 品質(zhì)地庫標(biāo)準(zhǔn)研發(fā)成果V1.0
- TMS開發(fā)業(yè)務(wù)需求文檔
- 2023年1月浙江高考英語聽力試題及答案(含MP3+錄音原文)
- HI-IPDV10芯片產(chǎn)品開發(fā)流程V10宣課件
- 房產(chǎn)抵押注銷申請(qǐng)表
- 【課件】第三課 蒙娜麗莎 課件高中美術(shù)湘美版美術(shù)鑒賞
- A320系列飛行訓(xùn)練課程:電子飛行儀表系統(tǒng)概況
評(píng)論
0/150
提交評(píng)論