《 Spring Boot從入門到實戰(zhàn)(第2版·微課視頻版)》 課件 第8章 Spring Boot的安全控制_第1頁
《 Spring Boot從入門到實戰(zhàn)(第2版·微課視頻版)》 課件 第8章 Spring Boot的安全控制_第2頁
《 Spring Boot從入門到實戰(zhàn)(第2版·微課視頻版)》 課件 第8章 Spring Boot的安全控制_第3頁
《 Spring Boot從入門到實戰(zhàn)(第2版·微課視頻版)》 課件 第8章 Spring Boot的安全控制_第4頁
《 Spring Boot從入門到實戰(zhàn)(第2版·微課視頻版)》 課件 第8章 Spring Boot的安全控制_第5頁
已閱讀5頁,還剩32頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第8章SpringBoot的安全控制學習目的與要求本章首先重點講解SpringSecurity安全控制機制,然后介紹SpringBootSecurity操作實例。通過本章的學習,掌握如何使用SpringSecurity安全控制機制解決企業(yè)應用程序的安全問題?!禨pringBoot從入門到實戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學出版社,2024

目錄8.1SpringSecurity快速入門8.2SpringBoot的支持8.3實際開發(fā)中的SpringSecurity操作實例《SpringBoot從入門到實戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學出版社,2024

8.1.1什么是SpringSecuritySpringSecurity是一個專門針對Sping應用系統(tǒng)的安全框架,充分利用了Spring框架的依賴注入和AOP功能,為Spring應用系統(tǒng)提供安全訪問控制解決方案。在SpringSecurity安全框架中,有兩個重要概念,即授權(Authorization)和認證(Authentication)。授權即確定用戶在當前應用系統(tǒng)下所擁有的功能權限;認證即確認用戶訪問當前系統(tǒng)的身份?!禨pringBoot從入門到實戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學出版社,2024

8.1.2SpringSecurity的用戶認證在SpringSecurity安全框架中,可以通過配置AuthenticationManager認證管理器完成用戶認證。示例代碼如下:@BeanpublicAuthenticationManagerauthenticationManager(AuthenticationConfigurationauthenticationConfiguration)throwsException{returnauthenticationConfiguration.getAuthenticationManager();}《SpringBoot從入門到實戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學出版社,2024

1.內存中的用戶認證在SpringSecurity安全框架中,InMemoryUserDetailsManager實現了UserDetailsService,以支持存儲在內存中的用戶名/密碼的身份驗證。InMemoryUserDetailsManager通過實現UserDetailsMnager接口提供對UserDetails的管理。當SpringSecurity配置為接受用戶名和密碼進行身份驗證時,會使用基于UserDetails的身份驗證?!禨pringBoot從入門到實戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學出版社,2024

1.內存中的用戶認證@BeanpublicUserDetailsServiceusers(){ UserDetailsuser=User.builder() .username("chenheng") .password("xxxx")

.roles("USER") .build(); UserDetailsadmin=User.builder() .username("admin") .password("yyyy")

.roles("DBA","ADMIN") .build(); returnnewInMemoryUserDetailsManager(user,admin);}《SpringBoot從入門到實戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學出版社,2024

2.通用的用戶認證我們在實際應用中,可以查詢數據庫獲取用戶和權限,這時我們需要自定義實現org.springframework.security.core.userdetails.UserDetailsService接口的類,并重寫publicUserDetailsloadUserByUsername(Stringusername)方法查詢對應的用戶和權限?!禨pringBoot從入門到實戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學出版社,2024

8.1.4SpringSecurity的請求授權在SpringSecurity安全框架中,可以通過配置SecurityFilterChain完成用戶授權。示例代碼如下:@BeanpublicSecurityFilterChainfilterChain(HttpSecurityhttp)throwsException{ http .authorizeHttpRequests(authorize->authorize .requestMatchers("/xxx").permitAll() .requestMatchers("/user/**").hasRole("USER") //其他所有請求認證授權后才能訪問

.anyRequest().authenticated() ); returnhttp.build();}《SpringBoot從入門到實戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學出版社,2024

8.1.4SpringSecurity的請求授權在filterChain(HttpSecurityhttp)方法中,使用HttpSecurity的authorizeHttpRequests()方法的子節(jié)點給指定用戶授權訪問URL模式。我們可以通過requestMatchers()方法匹配URL路徑。匹配請求路徑后,可以針對當前用戶對請求進行安全處理。方法用途anyRequest()匹配所有請求路徑access(Stringattribute)SpringEL表達式結果為true時可以訪問anonymous()匿名可以訪問authenticated()用戶登錄后可訪問denyAll()用戶不能訪問fullyAuthenticated()用戶完全認證可以訪問(非remember-me下自動登錄)hasAnyAuthority(String...)參數表示權限,用戶權限與其中任一權限相同就可以訪問hasAnyRole(String...)參數表示角色,用戶角色與其中任一角色相同就可以訪問hasAuthority(Stringauthority)參數表示權限,用戶權限與參數相同才可以訪問hasRole(Stringrole)參數表示角色,用戶角色與參數相同才可以訪問permitAll()任何用戶都可以訪問rememberMe()允許通過remember-me登錄的用戶訪問《SpringBoot從入門到實戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學出版社,2024

8.1.5SpringSecurity的核心類SpringSecurity的核心類包括Authentication、DaoAuthenticationProvider、GrantedAuthority、PasswordEncoder、SecurityContextHolder、UserDetails和UserDetailsService?!禨pringBoot從入門到實戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學出版社,2024

1.AuthenticationAuthentication用來封裝用戶認證信息的接口,在用戶登錄認證之前,SpringSecurity將相關信息封裝為一個Authentication具體實現類的對象,在登錄認證成功后將生成一個信息更全面、包含用戶權限等信息的Authentication對象,然后將該對象保存在SecurityContextHolder所持有的SecurityContext中,方便后續(xù)程序進行調用,如當前用戶名、訪問權限等?!禨pringBoot從入門到實戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學出版社,2024

2.SecurityContextHolderSecurityContextHolder顧名思義是用來持有SecurityContext的類。SecurityContext中包含當前認證用戶的詳細信息。SpringSecurity使用一個Authentication對象描述當前用戶的相關信息。例如,最常見的是獲得當前登錄用戶的用戶名和權限。privateStringgetUname(){

returnSecurityContextHolder.getContext().getAuthentication().getName();}privateStringgetAuthorities(){

Authenticationauthentication=SecurityContextHolder.getContext().getAuthentication();

List<String>roles=newArrayList<String>();

for(GrantedAuthorityga:authentication.getAuthorities()){

roles.add(ga.getAuthority());

}

returnroles.toString();}《SpringBoot從入門到實戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學出版社,2024

3.UserDetailsUserDetails是SpringSecurity的一個核心接口。該接口定義了一些可以獲取用戶名、密碼、權限等與認證相關的信息的方法。通常需要在應用中獲取當前用戶的其他信息,如Email、電話等。這時只包含認證相關的UserDetails對象可能就不能滿足我們的需要了。我們可以實現自己的UserDetails,在該實現類中定義一些獲取用戶其他信息的方法,這樣我們就可以直接從當前SecurityContext的Authentication的principal中獲取用戶的其他信息。Authentication.getPrincipal()的返回類型是Object,但通常返回的其實是一個UserDetails的實例,通過強制類型轉換可以將Object轉換為UserDetails類型?!禨pringBoot從入門到實戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學出版社,2024

4.UserDetailsServiceUserDetails是通過UserDetailsService的loadUserByUsername(Stringusername)方法加載的。UserDetailsService也是一個接口,也需要實現自己的UserDetailsService來加載自定義的UserDetails信息。登錄認證時,SpringSecurity將通過UserDetailsService的loadUserByUsername(Stringusername)方法獲取對應的UserDetails進行認證,認證通過后將該UserDetails賦給認證通過的Authentication的principal,然后再將該Authentication保存在SecurityContext中。在應用中,如果需要使用用戶信息,可以通過SecurityContextHolder獲取存放在SecurityContext中的Authentication的principal,即UserDetails實例?!禨pringBoot從入門到實戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學出版社,2024

5.GrantedAuthorityAuthentication的getAuthorities()方法可以返回當前Authentication對象擁有的權限(一個GrantedAuthority類型的數組),即當前用戶擁有的權限。GrantedAuthority是一個接口,通常是通過UserDetailsService進行加載,然后賦給UserDetails。《SpringBoot從入門到實戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學出版社,2024

6.DaoAuthenticationProvider在SpringSecurity安全框架中,默認使用DaoAuthenticationProvider實現AuthenticationProvider接口進行用戶認證的處理。DaoAuthenticationProvider進行認證時,需要一個UserDetailsService來獲取用戶信息UserDetails。當然我們可以實現自己的AuthenticationProvider,進而改變認證方式。《SpringBoot從入門到實戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學出版社,2024

7.PasswordEncoder在SpringSecurity安全框架中,是通過PasswordEncoder接口完成對密碼的加密。SpringSecurity對PasswordEncoder有多種實現,包括MD5加密、SHA-256加密等,開發(fā)者只需直接使用即可。在SpringBoot應用中,使用BCryptPasswordEncoder加密是較好的選擇。BCryptPasswordEncoder使用BCrypt的強散列哈希加密實現,并可以由客戶端指定加密強度,強度越高安全性越高?!禨pringBoot從入門到實戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學出版社,2024

8.1.6SpringSecurity的驗證機制SpringSecurity的驗證機制是由許多Filter實現的,Filter將在SpringMVC前攔截請求,主要包括注銷Filter(LogoutFilter)、用戶名密碼驗證Filter(UsernamePasswordAuthenticationFilter)等內容。Filter再交由其他組件完成細分的功能,最常用的UsernamePasswordAuthenticationFilter會持有一個AuthenticationManager引用,AuthenticationManager是一個驗證管理器,專門負責驗證。AuthenticationManager持有一個AuthenticationProvider集合,AuthenticationProvider是做驗證工作的組件,驗證成功或失敗之后調用對應的Hanlder(處理)。《SpringBoot從入門到實戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學出版社,2024

目錄8.1SpringSecurity快速入門8.2SpringBoot的支持8.3實際開發(fā)中的SpringSecurity操作實例《SpringBoot從入門到實戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學出版社,2024

8.2SpringBoot的支持在SpringBoot應用中,我們只需引入spring-boot-starter-security依賴即可使用SpringSecurity安全框架,這是因為SpringBoot對SpringSecurity提供了自動配置功能。從org.springframework.boot.autoconfigure.security.SecurityProperties類中,我們可以看到使用以“spring.security”為前綴的屬性配置了SpringSecurity的相關默認配置?!禨pringBoot從入門到實戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學出版社,2024

目錄8.1SpringSecurity快速入門8.2SpringBoot的支持8.3實際開發(fā)中的SpringSecurity操作實例《SpringBoot從入門到實戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學出版社,2024

8.3實際開發(fā)中的SpringSecurity操作實例【例7-1】在SpringBoot應用中,使用基于SpringDataJPA的SpringSecurity安全框架。1.創(chuàng)建SpringBootWeb應用ch8創(chuàng)建基于Lombok、SpringDataJPA、Thymeleaf及SpringSecurity的Web應用ch8,如圖8.1所示?!禨pringBoot從入門到實戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學出版社,2024

8.3實際開發(fā)中的SpringSecurity操作實例2.修改pom.xml文件,添加MySQL依賴在pom.xml文件中添加MySQL連接器依賴,配置內容與【例6-1】中的相同,不再贅述。3.設置Web應用ch8的上下文路徑及數據源配置信息在應用ch8的perties文件中配置內容與【例6-1】中的相同,不再贅述。4.整理腳本樣式靜態(tài)文件JS腳本、CSS樣式、圖片等靜態(tài)文件默認放置在src/main/resources/static目錄下,ch8應用引入的BootStrap和jQuery與【例5-5】中的一樣,不再贅述?!禨pringBoot從入門到實戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學出版社,2024

8.3實際開發(fā)中的SpringSecurity操作實例5.創(chuàng)建用戶和權限持久化實體類在應用ch8的src/main/java目錄下,創(chuàng)建名為com.ch.ch8.entity的包,并在該包中創(chuàng)建持久化實體類MyUser和Authority。MyUser類用來保存用戶數據,用戶名唯一。Authority用來保存權限信息。用戶和權限是多對多的關系?!禨pringBoot從入門到實戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學出版社,2024

8.3實際開發(fā)中的SpringSecurity操作實例6.創(chuàng)建數據訪問層接口在應用ch8的src/main/java目錄下,創(chuàng)建名為com.ch.ch8.repository的包,并在該包中創(chuàng)建名為MyUserRepository的接口,該接口繼承了JpaRepository,核心代碼如下:publicinterfaceMyUserRepositoryextendsJpaRepository<MyUser,Integer>{ //根據用戶名查詢用戶,方法名命名符合SpringDataJPA規(guī)范

MyUserfindByUsername(Stringusername);}在com.ch.ch8.repository包中,創(chuàng)建名為AuthorityRepository的接口,該接口繼承了JpaRepository,具體代碼如下:publicinterfaceAuthorityRepositoryextendsJpaRepository<Authority,Integer>{}《SpringBoot從入門到實戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學出版社,2024

8.3實際開發(fā)中的SpringSecurity操作實例7.創(chuàng)建業(yè)務層在應用ch8的src/main/java目錄下,創(chuàng)建名為com.ch.ch8.service的包,并在該包中創(chuàng)建UserService接口和UserServiceImpl實現類?!禨pringBoot從入門到實戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學出版社,2024

8.3實際開發(fā)中的SpringSecurity操作實例8.創(chuàng)建控制器類在應用ch8的src/main/java目錄下,創(chuàng)建名為com.ch.ch8.controller的包,并在該包中創(chuàng)建控制器類TestSecurityController?!禨pringBoot從入門到實戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學出版社,2024

8.3實際開發(fā)中的SpringSecurity操作實例9.創(chuàng)建應用的安全控制相關實現在應用ch8的src/main/java目錄下,創(chuàng)建名為com.ch.ch8.security的包,并在該包中創(chuàng)建MyUserSecurityService、MyAuthenticationSuccessHandler和SpringSecurityConfig類。MyUserSecurityService實現了UserDetailsService接口,并通過重寫loadUserByUsername(Stringusername)方法查詢對應的用戶,并將用戶名、密碼、權限等與認證相關的信息封裝在UserDetails對象中?!禨pringBoot從入門到實戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學出版社,2024

8.3實際開發(fā)中的SpringSecurity操作實例MyAuthenticationSuccessHandler繼承了SimpleUrlAuthenticationSuccessHandler類,并重寫了handle(HttpServletRequestrequest,HttpServletResponseresponse,Authenticationauthentication)方法,根據當前認證用戶的角色指定對應的URL。SpringSecurityConfig類是認證和授權處理的配置類,需要使用@Configuration和@EnableWebSecurity注解。在該類中配置了加密規(guī)則、認證實現方式、認證管理器以及授權操作?!禨pringBoot從入門到實戰(zhàn)(第2版·微課視頻版)》陳恒

主編,清華大學出版社,2024

8.3實際開發(fā)中的SpringSecurity操作實例10.創(chuàng)建用于測試的視圖頁

溫馨提示

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

評論

0/150

提交評論