2.Springsecurity環(huán)境搭建、實(shí)現(xiàn)原理、流程分析-創(chuàng)新互聯(lián)

創(chuàng)建項(xiàng)目

spring boot
spring security

成都創(chuàng)新互聯(lián)公司堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站建設(shè)、做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的石獅網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
  • 認(rèn)證:判斷用戶是否是系統(tǒng)合法用戶過程
  • 授權(quán):判斷系統(tǒng)內(nèi)用戶可以訪問或具有訪問哪些資源權(quán)限
1.創(chuàng)建springboot應(yīng)用

在這里插入圖片描述

2.創(chuàng)建controller
@RestController
public class HelloController {@RequestMapping("/hello")
    public String Hello(){System.out.println("spring security");
        return "hello spring security";
    }
}

在這里插入圖片描述

3.啟動(dòng)項(xiàng)目進(jìn)行測(cè)試

在這里插入圖片描述

整合Spring Security 1.引入spring security依賴
org.springframework.bootspring-boot-starter-security
2.再次啟動(dòng)項(xiàng)目
  • 啟動(dòng)項(xiàng)目后在控制臺(tái)會(huì)生成一個(gè)密碼
  • 訪問hello發(fā)現(xiàn)直接跳轉(zhuǎn)到登錄頁(yè)面
    在這里插入圖片描述在這里插入圖片描述
3.登錄系統(tǒng)
  • 默認(rèn)用戶名:user
  • 默認(rèn)密碼:控制臺(tái)輸出的uuid
    在這里插入圖片描述
    在這里插入圖片描述

這就是Spring Security 的強(qiáng)大之處,只需要引入一個(gè)依賴,所有的接口就會(huì)自動(dòng)保護(hù)起來!

思考?

  • 為什么引入Spring Security之后沒有任何配所有請(qǐng)求就要認(rèn)證呢?
  • 在項(xiàng)目中明明沒有登錄界面,登錄界面怎么來的呢?
  • 為什么使用user和 控制臺(tái)密碼能登陸,登錄時(shí)驗(yàn)證數(shù)據(jù)源存在哪里呢?
實(shí)現(xiàn)原理

在 Spring Security 中認(rèn)證、授權(quán)等功能都是基于過濾器完成的。

在這里插入圖片描述

在這里插入圖片描述

需要注意的是,默認(rèn)過濾器并不是直接放在 Web 項(xiàng)目的原生過濾器鏈中,而是通過一FilterChainProxy 來統(tǒng)一管理。Spring Security 中的過濾器鏈通過 FilterChainProxy 嵌入到 Web項(xiàng)目的原生過濾器鏈中。FilterChainProxy 作為一個(gè)頂層的管理者,將統(tǒng)一管理 Security Filter。FilterChainProxy 本身是通過 Spring 框架提供的 DelegatingFilterProxy 整合到原生的過濾器鏈中。

Security Filters

過濾器過濾器作用默認(rèn)是否加載
ChannelProcessingFilter過濾請(qǐng)求協(xié)議 HTTP 、HTTPSNO
WebAsyncManagerIntegrationFilter將 WebAsyncManger 與 SpringSecurity 上下文進(jìn)行集成YES
SecurityContextPersistenceFilter在處理請(qǐng)求之前,將安全信息加載到 SecurityContextHolder 中YES
HeaderWriterFilter處理頭信息加入響應(yīng)中YES
CorsFilter處理跨域問題NO
CsrfFilter處理 CSRF 攻擊YES
LogoutFilter處理注銷登錄YES
OAuth2AuthorizationRequestRedirectFilter處理 OAuth2 認(rèn)證重定向NO
Saml2WebSsoAuthenticationRequestFilter處理 SAML 認(rèn)證NO
X509AuthenticationFilter處理 X509 認(rèn)證NO
AbstractPreAuthenticatedProcessingFilter處理預(yù)認(rèn)證問題NO
CasAuthenticationFilter處理 CAS 單點(diǎn)登錄NO
OAuth2LoginAuthenticationFilter處理 OAuth2 認(rèn)證NO
Saml2WebSsoAuthenticationFilter處理 SAML 認(rèn)證NO
UsernamePasswordAuthenticationFilter處理表單登錄YES
OpenIDAuthenticationFilter處理 OpenID 認(rèn)證NO
DefaultLoginPageGeneratingFilter配置默認(rèn)登錄頁(yè)面YES
DefaultLogoutPageGeneratingFilter配置默認(rèn)注銷頁(yè)面YES
ConcurrentSessionFilter處理 Session 有效期NO
DigestAuthenticationFilter處理 HTTP 摘要認(rèn)證NO
BearerTokenAuthenticationFilter處理 OAuth2 認(rèn)證的 Access TokenNO
BasicAuthenticationFilter處理 HttpBasic 登錄YES
RequestCacheAwareFilter處理請(qǐng)求緩存YES
SecurityContextHolder
AwareRequestFilter
包裝原始請(qǐng)求YES
JaasApiIntegrationFilter處理 JAAS 認(rèn)證NO
RememberMeAuthenticationFilter處理 RememberMe 登錄NO
AnonymousAuthenticationFilter配置匿名認(rèn)證YES
OAuth2AuthorizationCodeGrantFilter處理OAuth2認(rèn)證中授權(quán)碼NO
SessionManagementFilter處理 session 并發(fā)問題YES
ExceptionTranslationFilter處理認(rèn)證/授權(quán)中的異常YES
FilterSecurityInterceptor處理授權(quán)相關(guān)YES
SwitchUserFilter處理賬戶切換NO

可以看出,Spring Security 提供了 30 多個(gè)過濾器。默認(rèn)情況下Spring Boot 在對(duì) Spring Security 進(jìn)入自動(dòng)化配置時(shí),會(huì)創(chuàng)建一個(gè)名為 SpringSecurityFilerChain 的過濾器,并注入到 Spring 容器中,這個(gè)過濾器將負(fù)責(zé)所有的安全管理,包括用戶認(rèn)證、授權(quán)、重定向到登錄頁(yè)面等。

SpringBootWebSecurityConfiguration

這個(gè)類是 spring boot 自動(dòng)配置類,通過這個(gè)源碼得知,默認(rèn)情況下對(duì)所有請(qǐng)求進(jìn)行權(quán)限控制:

@Configuration(proxyBeanMethods = false)
@ConditionalOnDefaultWebSecurity
@ConditionalOnWebApplication(type = Type.SERVLET)
class SpringBootWebSecurityConfiguration {@Bean
	@Order(SecurityProperties.BASIC_AUTH_ORDER)
	SecurityFilterChain defaultSecurityFilterChain(HttpSecurity http) 
    throws Exception {	http.authorizeRequests().anyRequest()
      .authenticated().and().formLogin().and().httpBasic();
		return http.build();
	}
}

在這里插入圖片描述這就是為什么在引入 Spring Security 中沒有任何配置情況下,請(qǐng)求會(huì)被攔截的原因

通過上面對(duì)自動(dòng)配置分析,我們也能看出默認(rèn)生效條件為:

  • 條件一 classpath中存在 SecurityFilterChain.class, HttpSecurity.class
  • 條件二 沒有自定義 WebSecurityConfigurerAdapter.class, SecurityFilterChain.class

默認(rèn)情況下,條件都是滿足的。WebSecurityConfigurerAdapter 這個(gè)類極其重要,Spring Security 核心配置都在這個(gè)類中:
在這里插入圖片描述
如果要對(duì) Spring Security 進(jìn)行自定義配置,就要自定義這個(gè)類實(shí)例,通過覆蓋類中方法達(dá)到修改默認(rèn)配置的目的。

流程分析

在這里插入圖片描述

  1. 請(qǐng)求 /hello 接口,在引入 spring security 之后會(huì)先經(jīng)過一些列過濾器
  2. 在請(qǐng)求到達(dá) FilterSecurityInterceptor時(shí),發(fā)現(xiàn)請(qǐng)求并未認(rèn)證。請(qǐng)求攔截下來,并拋出 AccessDeniedException 異常。
  3. 拋出 AccessDeniedException 的異常會(huì)被 ExceptionTranslationFilter 捕獲,這個(gè) Filter 中會(huì)調(diào)用 LoginUrlAuthenticationEntryPoint#commence 方法給客戶端返回 302,要求客戶端進(jìn)行重定向到 /login 頁(yè)面。
  4. 客戶端發(fā)送 /login 請(qǐng)求。
  5. /login 請(qǐng)求會(huì)再次被攔截器中 DefaultLoginPageGeneratingFilter 攔截到,并在攔截器中返回生成登錄頁(yè)面。

就是通過這種方式,Spring Security 默認(rèn)過濾器中生成了登錄頁(yè)面,并返回!

默認(rèn)用戶生成
  1. 查看 SpringBootWebSecurityConfiguration#defaultSecurityFilterChain 方法表單登錄
    在這里插入圖片描述
    2.處理登錄為 FormLoginConfigurer 類中 調(diào)用 UsernamePasswordAuthenticationFilter這個(gè)類實(shí)例
    在這里插入圖片描述3.查看類中 UsernamePasswordAuthenticationFilter#attempAuthentication 方法得知實(shí)際調(diào)用 AuthenticationManager 中 authenticate 方法
    在這里插入圖片描述4.調(diào)用 ProviderManager 類中方法 authenticate
    在這里插入圖片描述
    5.調(diào)用了 ProviderManager 實(shí)現(xiàn)類中 AbstractUserDetailsAuthenticationProvider類中方法
    在這里插入圖片描述
    6.最終調(diào)用實(shí)現(xiàn)類 DaoAuthenticationProvider 類中方法比較
    在這里插入圖片描述

在這里插入圖片描述看到這里就知道默認(rèn)實(shí)現(xiàn)是基于 InMemoryUserDetailsManager 這個(gè)類,也就是內(nèi)存的實(shí)現(xiàn)!

UserDetailService

通過剛才源碼分析也能得知 UserDetailService 是頂層父接口,接口中 loadUserByUserName 方法是用來在認(rèn)證時(shí)進(jìn)行用戶名認(rèn)證方法,默認(rèn)實(shí)現(xiàn)使用是內(nèi)存實(shí)現(xiàn),如果想要修改數(shù)據(jù)庫(kù)實(shí)現(xiàn)我們只需要自定義 UserDetailService 實(shí)現(xiàn),最終返回 UserDetails 實(shí)例即可。

public interface UserDetailsService {UserDetails loadUserByUsername(String username) throws UsernameNotFoundException;
}

在這里插入圖片描述

總結(jié)
  • AuthenticationManager、ProviderManger、以及 AuthenticationProvider 關(guān)系

在這里插入圖片描述

  • WebSecurityConfigurerAdapter擴(kuò)展 Spring Security 所有默認(rèn)配置
    在這里插入圖片描述
  • UserDetailService 用來修改默認(rèn)認(rèn)證的數(shù)據(jù)源信息
    在這里插入圖片描述

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧

網(wǎng)頁(yè)名稱:2.Springsecurity環(huán)境搭建、實(shí)現(xiàn)原理、流程分析-創(chuàng)新互聯(lián)
URL分享:http://muchs.cn/article32/cspdpc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供ChatGPT企業(yè)建站、軟件開發(fā)、虛擬主機(jī)、網(wǎng)站改版、網(wǎng)站收錄

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)公司