SpringBoot教程(第4版)課件 第6章 Spring Boot安全框架_第1頁
SpringBoot教程(第4版)課件 第6章 Spring Boot安全框架_第2頁
SpringBoot教程(第4版)課件 第6章 Spring Boot安全框架_第3頁
SpringBoot教程(第4版)課件 第6章 Spring Boot安全框架_第4頁
SpringBoot教程(第4版)課件 第6章 Spring Boot安全框架_第5頁
已閱讀5頁,還剩28頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

第6章SpringBoot安全框架——SpringSecurity基礎(chǔ)SpringBoot實用教程(第4版)目錄01SpringSecurity簡介SpringSecurity簡介SpringSecurity是一個專門針對Spring/SpringBoot應(yīng)用系統(tǒng)的安全框架,它充分利用了Spring的依賴注入和AOP功能,為網(wǎng)站提供聲明式的安全訪問控制解決方案,使用這個框架進(jìn)行開發(fā),可省去為企業(yè)系統(tǒng)安全控制而不得不編寫的大量重復(fù)代碼,有助于提高可靠性和開發(fā)效率。SpringSecurity基于SpringAOP和Servlet過濾器,對訪問用戶進(jìn)行認(rèn)證和授權(quán),除此之外,它還提供了ACLS、LDAP、JAAS、CAS等高級特性以滿足復(fù)雜環(huán)境下的安全需求。認(rèn)證(Authentication)和授權(quán)(Authorization)是SpringSecurity框架最為重要的兩大核心功能,認(rèn)證即確認(rèn)用戶是否可以訪問當(dāng)前系統(tǒng);授權(quán)則進(jìn)一步確定用戶在當(dāng)前系統(tǒng)下所擁有的操作權(quán)限。目錄02SpringSecurity安全應(yīng)用架構(gòu)SpringSecurity安全應(yīng)用架構(gòu)SpringSecurity的安全應(yīng)用架構(gòu)如圖6.1所示。SpringSecurity安全應(yīng)用架構(gòu)(1)認(rèn)證訪問用戶的帳號信息被SpringSecurity封裝于一個類型為UserDetails的實體內(nèi),由開發(fā)者編寫的服務(wù)類通過實現(xiàn)UserDetailsService接口中的loadUserByUsername方法獲取。認(rèn)證時還可對用戶密碼進(jìn)行加密,SpringSecurity5默認(rèn)采用BCrypt算法的加密器,開發(fā)者也可以定義自己的加密器(通過實現(xiàn)PasswordEncoder)。最后,將開發(fā)好的服務(wù)類、加密器等組件注入(用@Bean)到SpringBoot容器中,再由作為配置類的WebSecurityConfigurerAdapter適配器將它們配置注冊(用AuthenticationManagerBuilder)進(jìn)系統(tǒng)即可開始正常工作并發(fā)揮認(rèn)證作用。(2)授權(quán)對來訪用戶應(yīng)用的權(quán)限規(guī)則寫在另一個configure方法(HttpSecurity為參數(shù))中,它可與前端的thymeleaf-extras-springsecurity5(Thymeleaf的SpringSecurity擴展支持)組件配合使用,以sec:系列標(biāo)簽判斷登錄用戶的角色、獲取用戶名等,賦予不同權(quán)限的用戶訪問不一樣的頁面內(nèi)容。第6章SpringBoot安全框架——用戶認(rèn)證目錄01安全框架中的用戶1.內(nèi)存用戶2.JDBC數(shù)據(jù)源用戶3.通用用戶安全框架中的用戶1.內(nèi)存用戶使用AuthenticationManagerBuilder的inMemoryAuthentication方法即可添加內(nèi)存中的臨時用戶,并可給其指定角色和權(quán)限。但此種方式多在開發(fā)和測試階段用于快速驗證需求,正式上線運行的系統(tǒng)一般不會采用,因為內(nèi)存空間畢竟有限,且會占用JVM的內(nèi)存,降低性能。2.JDBC數(shù)據(jù)源用戶通過JDBC獲取用戶信息,直接指定dataSource(數(shù)據(jù)源)即可,這種方式下是由SpringSecurity默認(rèn)了數(shù)據(jù)庫的結(jié)構(gòu),在JDBC持久層實現(xiàn)中定義好默認(rèn)的用戶及其角色權(quán)限獲取的SQL語句,當(dāng)然開發(fā)者也可以自定義查詢用戶和權(quán)限的SQL語句。此種方式無法適應(yīng)多種多樣的數(shù)據(jù)庫類型,因此用得也不多。安全框架中的用戶3.通用用戶這是普遍采用的方式,用戶信息和權(quán)限的獲取可通過各種不同的持久層框架,用戶信息既可存放在關(guān)系數(shù)據(jù)庫中,也可存于非關(guān)系型數(shù)據(jù)庫,非常靈活。使用通用用戶必須由開發(fā)者自定義實現(xiàn)UserDetailsService接口的類,并重寫其中的loadUserByUsername方法査詢對應(yīng)的用戶和權(quán)限。實際上,上面內(nèi)存中的用戶及JDBC數(shù)據(jù)源用戶也都是UserDetailsService的實現(xiàn),只不過是由SpringSecurity框架提供的現(xiàn)成默認(rèn)實現(xiàn),供特殊情況下有需要時使用而已。目錄02認(rèn)證信息的獲取1.UserDetails用戶實體2.UserDetailsService接口認(rèn)證信息的獲取1.UserDetails用戶實體UserDetails是SpringSecurity的用戶實體類,專用于存儲用戶名、密碼、權(quán)限等信息,它以框架中一個核心接口的形式提供給開發(fā)者,該接口中定義了一些可以獲取用戶名、密碼、權(quán)限等與認(rèn)證相關(guān)信息的方法,如下:StringgetUsername():返回用戶名,無法返回則顯示為null。StringgetPassword():返回密碼,無法返回則顯示為null。booleanisEnabled():用戶是否被禁用。禁用的用戶不能進(jìn)行身份認(rèn)證。booleanisAccountNonLocked():用戶帳號是否被鎖定或解鎖,鎖定的用戶無法進(jìn)行身份認(rèn)證。booleanisAccountNonExpired():用戶帳號是否過期,過期無法認(rèn)證。booleanisCredentialsNonExpired():用戶憑據(jù)(密碼)是否過期,過期則無法認(rèn)證。認(rèn)證信息的獲取2.UserDetailsService接口SpringSecurity提供了一個UserDetailsService接口,通過它可以獲取用戶信息,而這個接口中只有一個loadUserByUsername方法需要實現(xiàn)用來根據(jù)用戶名加載相關(guān)信息,該方法定義返回一個UserDetails類型的接口對象,其中就包含了用戶的各項信息,包括用戶名、密碼、權(quán)限、是否啟用、是否被鎖定、是否過期等。登錄認(rèn)證時,SpringSecurity將通過UserDetailsService的loadUserByUsername方法獲取對應(yīng)的UserDetails實體對象進(jìn)行認(rèn)證。第6章SpringBoot安全框架——請求授權(quán)SpringBoot實用教程(第4版)請求授權(quán)在安全應(yīng)用架構(gòu)中,配置類繼承了WebSecurityConfigurerAdapter適配器類,并覆蓋了其configure(AuthenticationManagerBuilder)方法,除此之外,適配器中還提供了另外一個方法,那就是configure(HttpSecurity),通過它便能夠?qū)崿F(xiàn)對于不同角色用戶賦予不同權(quán)限的功能。configure(HttpSecurity)方法使用其參數(shù)HttpSecurity的authorizeRequests()方法的子節(jié)點給指定用戶授權(quán)訪問URL的模式。因為適配器類已經(jīng)提供了configure(HttpSecurity)方法的默認(rèn)實現(xiàn),所以通常情況下,只要是通過了認(rèn)證的用戶便可以訪問所有的請求地址。還可以通過formLogin方法配置默認(rèn)的登錄頁面、失敗轉(zhuǎn)向頁面,通過httpBasic方法啟用瀏覽器的HTTP基礎(chǔ)認(rèn)證方式。請求授權(quán)在默認(rèn)情況下,只要是登錄了的用戶,其一切的請求都會暢通無阻,但這樣在實際應(yīng)用中是很不安全的,畢竟不同的用戶有著不同的角色,必須根據(jù)角色來授予不一樣的權(quán)限才行。因此通常需要在configure(HttpSecurity)方法中自定義一系列安全訪問的規(guī)則,可以通過antmatchers方法使用Ant風(fēng)格或者正則式來匹配URL路徑,然后針對當(dāng)前用戶的信息對請求路徑進(jìn)行安全處理,SpringSecurity提供了許多安全處理方法,具體如表6.1所示。安全處理方法用途anyRequest()匹配所有請求路徑authenticated()用戶登錄后可訪問formLogin()啟用安全框架默認(rèn)的登錄頁面httpBasic()啟用瀏覽器的HTTP基礎(chǔ)認(rèn)證permitAll()用戶可任意訪問anonymous()匿名可訪問access(String)SpringEL表達(dá)式結(jié)果為true時可訪問rememberMe()允許通過了remember-me功能認(rèn)證的用戶訪問fullyAuthenticated()用戶只有在完全(非remember-me)認(rèn)證的情況下可訪問denyAll()不允許任何訪問and()連接詞,并取消之前限定的前提規(guī)則not()對其他方法的訪問采取求反hasAuthority(String)用戶是給定的角色才允許訪問(參數(shù)字符串表示角色)hasAnyAuthority(String...)只要用戶具有給定角色中的任意一個就允許訪問(參數(shù)字符串指定多個角色)hasRole(String)將訪問權(quán)限授予一個角色(角色名會自動加前綴“ROLE_”)hasAnyRole(String...)將訪問權(quán)限授予多個角色(角色名會自動加前綴“ROLE_”)hasIpAddress(String)用戶來自給定的IP才允許訪問(參數(shù)字符串表示IP地址)第6章SpringBoot安全框架——安全應(yīng)用實例SpringBoot實用教程(第4版)安全應(yīng)用實例【實例6.1】運用SpringSecurity安全框架實現(xiàn)“商品信息管理系統(tǒng)”登錄功能。根據(jù)不同用戶角色顯示不同的內(nèi)容界面,若為商家登錄,顯示“商品管理”表單;若為顧客登錄,則顯示“商品瀏覽”列表。本例與【實例2.6】功能上類同,但這里應(yīng)用了安全框架的功能而非.properties配置文件來管理和驗證不同角色的用戶。1.準(zhǔn)備數(shù)據(jù)庫表本例在MySQL數(shù)據(jù)庫中存儲登錄用戶的信息,但SpringSecurity框架要求用戶、角色及關(guān)聯(lián)數(shù)據(jù)必須按一定的格式保存在以特定方式關(guān)聯(lián)的多個表中,故先要來創(chuàng)建相關(guān)的表及錄入測試用樣本記錄。通過NavicatPremium連上MySQL,在其查詢編輯器中執(zhí)行SQL語句準(zhǔn)備表和數(shù)據(jù)。(1)訪客表(visitor)該表用于保存來訪的用戶帳號信息(用戶名和密碼),執(zhí)行SQL語句:USEnetshop;CREATETABLEvisitor( id int NOTNULLPRIMARYKEY, /*訪客號*/ username varchar(16)NOTNULL, /*用戶名*/ password varchar(12) NOTNULL /*密碼*/

);INSERTINTOvisitor(id,username,password)VALUES(1,'SXLC001A','888');INSERTINTOvisitor(id,username,password)VALUES(2,'','abc123');安全應(yīng)用實例(2)角色表(role)該表用于保存角色信息,本例設(shè)置了兩種角色,角色名分別是ROLE_SUP(商家)和ROLE_USER(顧客),執(zhí)行SQL語句:USEnetshop;CREATETABLErole( id int NOTNULLPRIMARYKEY, /*角色號*/ name varchar(10) NOTNULL /*角色名*/);INSERTINTOrole(id,name)VALUES(1,'ROLE_SUP');INSERTINTOrole(id,name)VALUES(2,'ROLE_USER');安全應(yīng)用實例(3)訪客-角色關(guān)聯(lián)表(visitor_roles)該表用于記錄訪客表中用戶帳號與角色表中角色之間的對應(yīng)關(guān)系,執(zhí)行SQL語句:USEnetshop;CREATETABLEvisitor_roles( visitor_id int NOTNULL, /*訪客號*/ roles_id int NOTNULL, /*角色號*/ FOREIGNKEY(visitor_id)REFERENCESvisitor(id) ONDELETERESTRICTONUPDATERESTRICT, FOREIGNKEY(roles_id)REFERENCESrole(id) ONDELETERESTRICTONUPDATERESTRICT);INSERTINTOvisitor_roles(visitor_id,roles_id)VALUES(1,1);INSERTINTOvisitor_roles(visitor_id,roles_id)VALUES(2,2);安全應(yīng)用實例2.創(chuàng)建項目創(chuàng)建SpringBoot項目,項目名為mystore,在出現(xiàn)的向?qū)Ы缑妗癉ependencies”列表中勾選SpringBoot基本框架(“Web”→“SpringWeb”)、Thymeleaf引擎組件(“TemplateEngines”→“Thymeleaf”)、Lombok模型簡化組件(“DeveloperTools”→“Lombok”)、JPA框架(“SQL”→“SpringDataJPA”)以及MySQL的驅(qū)動(“SQL”→“MySQLDriver”)。為使項目支持安全訪問,最重要的是添加SpringSecurity安全框架,勾選“Security”→“SpringSecurity”,如圖6.2所示。安全應(yīng)用實例添加的SpringSecurity安全框架在項目pom.xml文件中對應(yīng)有兩個依賴項,如下:<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency><dependency><groupId>org.thymeleaf.extras</groupId><artifactId>thymeleaf-extras-springsecurity5</artifactId></dependency>安全應(yīng)用實例3.配置連接打開項目工程目錄樹src→main→resources下的perties文件,在其中配置對MySQL數(shù)據(jù)庫的連接,內(nèi)容如下:spring.datasource.url=jdbc:mysql://localhost:3306/netshop?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC&useSSL=truespring.datasource.username=rootspring.datasource.password=123456spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver4.開發(fā)實體在項目工程目錄樹的com.example.mystore節(jié)點下創(chuàng)建entity包,其中創(chuàng)建訪客和角色兩個關(guān)聯(lián)的實體類。(1)訪客實體訪客實體對應(yīng)的是訪客表(visitor),設(shè)計實體類Visitor.java,代碼顯示。安全應(yīng)用實例(2)角色實體角色實體對應(yīng)的是角色表(role),其實體類Role.java的代碼如下:packagecom.example.mystore.entity;

importlombok.Data;

importjavax.persistence.Entity;importjavax.persistence.Id;

@Entity@DatapublicclassRole{ @Id privateintid; //角色號 privateStringname; //角色名}安全應(yīng)用實例5.開發(fā)持久層持久層就只有一個JPA數(shù)據(jù)接口,用于獲取數(shù)據(jù)庫中的訪客用戶數(shù)據(jù)。在項目工程目錄樹的com.example.mystore節(jié)點下創(chuàng)建repository包,其中創(chuàng)建接口VisitorRepository.java,定義代碼為:packagecom.example.mystore.repository;

importcom.example.mystore.entity.Visitor;importorg.springframework.data.jpa.repository.JpaRepository;

publicinterfaceVisitorRepositoryextendsJpaRepository<Visitor,Integer>{ VisitorfindByUsername(Stringusername); //根據(jù)用戶名查詢訪客}安全應(yīng)用實例6.定義安全服務(wù)類在項目工程目錄樹的com.example.mystore節(jié)點下創(chuàng)建service包,其中定義安全服務(wù)類。(1)實現(xiàn)UserDetailsService接口定義的安全服務(wù)類只要重寫接口中的loadUserByUsername方法。安全服務(wù)類MyUserDetailsService.java代碼顯示。(2)自定義加密器前面已經(jīng)講過,SpringSecurity5默認(rèn)采用BCrypt算法的加密器,但本例為簡單起見,存儲在MySQL中的用戶密碼用的都是明文,為免去加(解)密的麻煩,這里自定義了一個加密器,它不使用任何加密算法,直接將明文字符串原樣返回。安全應(yīng)用實例自定義加密器MyPasswordEncoder.java的代碼為:packagecom.example.mystore.service;

importorg.springframework.security.crypto.password.PasswordEncoder;

publicclassMyPasswordEncoderimplementsPasswordEncoder{ @Override publicStringencode(CharSequencesequence){ returnsequence.toString(); //直接將明文字符串原樣返回 }

@Override publicbooleanmatches(CharSequencesequence,Stringpassword){ returnpassword.equals(sequence.toString()); //直接明文匹配 }}安全應(yīng)用實例7.配置安全策略對安全策略的設(shè)計都在一個Java配置類中進(jìn)行,如前面所介紹的,也就是重寫安全框架適配器中的兩個configure方法。在項目工程目錄樹的com.example.mystore節(jié)點下創(chuàng)建configer包,其中創(chuàng)建配置類SecurityConfiger,繼承安全框架適配器WebSecurityConfigurerAdapter類。SecurityConfiger.java代碼顯示。說明:(a)builder.userDetailsService(getUserDetailsService()).passwordEncoder(getPasswordEncoder());:在第1個configure方法中配置認(rèn)證策略,通過AuthenticationManagerBuilder向安全框架中注入前面自定義的安全服務(wù)類及加密器。(b)http.authorizeRequests().anyRequest().authenticated().and().formLogin().loginPage("/index").failureUrl("/

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論