Spring Security

  1. 原理
    Spring Security是一個功能強(qiáng)大且高度可定制的身份驗證和訪問控制框架贰您。它是用于保護(hù)基于Spring的應(yīng)用程序的實際標(biāo)準(zhǔn)。
    Spring Security是一個框架赋咽,致力于為Java應(yīng)用程序提供身份驗證和授權(quán)。與所有Spring項目一樣窘疮,Spring Security的真正強(qiáng)大之處在于可以輕松擴(kuò)展以滿足自定義要求
image.png

Spring Security的體系結(jié)構(gòu)旨在將身份驗證與授權(quán)分開慌烧,并具有策略和擴(kuò)展點(diǎn)。

1.身份驗證


public interface AuthenticationManager {

  Authentication authenticate(Authentication authentication)
    throws AuthenticationException;

}

authenticate()方法中的三件事之一:

  • 如果可以驗證輸入是否代表有效的委托人膏燕,則返回Authentication(通常為authenticated=true)钥屈。
  • AuthenticationException如果它認(rèn)為輸入代表無效的主體,則拋出一個坝辫。
  • null如果無法決定篷就,則返回。
//An AuthenticationProvider有點(diǎn)像an近忙,AuthenticationManager但是它有一個額外的方法竭业,允許調(diào)用者查詢是否支持給定Authentication類型:
public interface AuthenticationProvider {

    Authentication authenticate(Authentication authentication)
            throws AuthenticationException;
/**
*
*/
    boolean supports(Class<?> authentication);

}
@Configuration
public class ApplicationSecurity extends WebSecurityConfigurerAdapter {

  @Autowired
  DataSource dataSource;

   ... // web stuff here

  @Override
  public void configure(AuthenticationManagerBuilder builder) {
    builder.jdbcAuthentication().dataSource(dataSource).withUser("dave")
      .password("secret").roles("USER");
  }

}

2.訪問控制

安全過濾器鏈 WebSecurityConfigurerAdapter

筆記:
5.1。認(rèn)證方式
5.1.1银锻。認(rèn)證支持
5.1.2永品。密碼儲存

  • DelegatingPasswordEncoder
    • 確保使用當(dāng)前密碼存儲建議對密碼進(jìn)行編碼

    • 允許以現(xiàn)代和舊式格式驗證密碼

    • 允許將來升級編碼

//.創(chuàng)建默認(rèn)的DelegatingPasswordEncoder
PasswordEncoder passwordEncoder =
    PasswordEncoderFactories.createDelegatingPasswordEncoder();
//創(chuàng)建自定義DelegatingPasswordEncoder
String idForEncode = "bcrypt";
Map encoders = new HashMap<>();
encoders.put(idForEncode, new BCryptPasswordEncoder());
encoders.put("noop", NoOpPasswordEncoder.getInstance());
encoders.put("pbkdf2", new Pbkdf2PasswordEncoder());
encoders.put("scrypt", new SCryptPasswordEncoder());
encoders.put("sha256", new StandardPasswordEncoder());
PasswordEncoder passwordEncoder =
    new DelegatingPasswordEncoder(idForEncode, encoders);
  • BCryptPasswordEncoder
  • Argon2PasswordEncoder
  • Pbkdf2PasswordEncoder

Spring Security 默認(rèn)使用DelegatingPasswordEncoder

@Bean
public static NoOpPasswordEncoder passwordEncoder() {
    return NoOpPasswordEncoder.getInstance();
}

Spring為防止 跨站請求偽造(CSRF)

CSRF攻擊之所以可能是因為受害者網(wǎng)站的HTTP請求與攻擊者網(wǎng)站的請求完全相同击纬。這意味著無法拒絕來自邪惡網(wǎng)站的請求并允許來自銀行網(wǎng)站的請求鼎姐。為了防御CSRF攻擊,我們需要確保惡意站點(diǎn)無法提供請求中的某些內(nèi)容更振,因此我們可以區(qū)分這兩個請求炕桨。
Spring提供了兩種機(jī)制來防御CSRF攻擊:

該解決方案是為了確保每個HTTP請求除了我們的會話cookie外,還必須在HTTP請求中包含一個安全的肯腕,隨機(jī)生成的值献宫,稱為CSRF令牌。
提交HTTP請求時实撒,服務(wù)器必須查找預(yù)期的CSRF令牌姊途,并將其與HTTP請求中的實際CSRF令牌進(jìn)行比較涉瘾。如果值不匹配,則應(yīng)拒絕HTTP請求捷兰。
讓我們看一下使用同步令牌模式時示例將如何變化立叛。假設(shè)實際的CSRF令牌必須位于名為的HTTP參數(shù)中_csrf
通常建議將該SameSite屬性用作深度防御贡茅,而不是針對CSRF攻擊的唯一防護(hù)秘蛇。

  • spring-security-core.jar
    該模塊包含核心身份驗證和訪問控制類和接口,遠(yuǎn)程支持和基本配置API顶考。使用Spring Security的任何應(yīng)用程序都需要它赁还。它支持獨(dú)立的應(yīng)用程序,遠(yuǎn)程客戶端驹沿,方法(服務(wù)層)安全性和JDBC用戶配置艘策。
    org.springframework.security.core
    org.springframework.security.access
    org.springframework.security.authentication
    org.springframework.security.provisioning

  • 網(wǎng)絡(luò)-?spring-security-web.jar
    該模塊包含過濾器和相關(guān)的Web安全基礎(chǔ)結(jié)構(gòu)代碼。它包含任何與Servlet API相關(guān)的內(nèi)容甚负。如果需要Spring Security Web認(rèn)證服務(wù)和基于URL的訪問控制

  • spring-security-config.jar
    該模塊包含安全名稱空間解析代碼和Java配置代碼柬焕。如果將Spring Security XML名稱空間用于配置或Spring Security的Java Configuration支持,則需要它梭域。
    LDAP-?spring-security-ldap.jar
    此模塊提供LDAP身份驗證和供應(yīng)代碼。如果您需要使用LDAP認(rèn)證或管理LDAP用戶條目搅轿,則

  • 此模塊提供LDAP身份驗證和供應(yīng)代碼病涨。如果您需要使用LDAP認(rèn)證或管理LDAP用戶條目,
    spring-security-oauth2-core.jar包含為OAuth 2.0授權(quán)框架和OpenID Connect Core 1.0提供支持的核心類和接口璧坟。使用OAuth 2.0或OpenID Connect Core 1.0的應(yīng)用程序(例如客戶端既穆,資源服務(wù)器和授權(quán)服務(wù)器)需要它。

  • OAuth 2.0客戶端-?spring-security-oauth2-client.jar
    spring-security-oauth2-client.jar包含Spring Security對OAuth 2.0授權(quán)框架和OpenID Connect Core 1.0的客戶端支持雀鹃。使用OAuth 2.0登錄或OAuth客戶端支持的應(yīng)用程序需要使用它

  • spring-security-oauth2-jose.jar包含Spring Security對JOSE(JavaScript對象簽名和加密)框架的支持幻工。

    • JSON Web令牌(JWT)
    • JSON Web簽名(JWS)
    • JSON Web加密(JWE)
    • JSON Web密鑰(JWK)
  • OAuth 2.0資源服務(wù)器-?spring-security-oauth2-resource-server.jar
    spring-security-oauth2-resource-server.jar包含Spring Security對OAuth 2.0資源服務(wù)器的支持。它用于通過OAuth 2.0承載令牌保護(hù)API黎茎。

  • ACL-?spring-security-acl.jar
    該模塊包含專門的域?qū)ο驛CL實現(xiàn)囊颅。它用于將安全性應(yīng)用于應(yīng)用程序中的特定域?qū)ο髮嵗?/p>

  • CAS —?spring-security-cas.jar
    該模塊包含Spring Security的CAS客戶端集成。如果要對CAS單點(diǎn)登錄服務(wù)器使用Spring Security Web認(rèn)證傅瞻,則應(yīng)該使用它踢代。

  • OpenID —?spring-security-openid.jar
    該模塊包含OpenID Web身份驗證支持。它用于根據(jù)外部OpenID服務(wù)器對用戶進(jìn)行身份驗證嗅骄。頂級軟件包是org.springframework.security.openid胳挎。它需要OpenID4Java。

Servlet應(yīng)用

Spring Security通過使用標(biāo)準(zhǔn)Servlet與Servlet容器集成Filter溺森。這意味著它可以與在Servlet容器中運(yùn)行的任何應(yīng)用程序一起使用慕爬。

Servlet安全性:大局

身份驗證”窑眯,“ 授權(quán)”“防止利用漏洞”部分中建立了這種高級理解。

image.png

FilterChain

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
    // do something before the rest of the application
    chain.doFilter(request, response); // invoke the rest of the application
    // do something after the rest of the application
}

DelegatingFilterProxy
DelegatingFilterProxy可以通過標(biāo)準(zhǔn)Servlet容器機(jī)制進(jìn)行注冊医窿,但是將所有工作委托給實現(xiàn)的Spring Bean Filter磅甩。


image.png

另一個好處DelegatingFilterProxy是,它允許延遲查找Filterbean實例留搔。這很重要更胖,因為容器需要Filter在容器啟動之前注冊實例。但是隔显,Spring通常使用a ContextLoaderListener來加載Spring Bean却妨,直到Filter需要注冊實例之后才能完成。

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) { // Lazily get Filter that was registered as a Spring Bean  // For the example in [DelegatingFilterProxy](https://docs.spring.io/spring-security/site/docs/5.3.2.BUILD-SNAPSHOT/reference/html5/#servlet-delegatingfilterproxy-figure)  `delegate` is an instance of *Bean Filter<sub>0</sub>* Filter delegate = getFilterBean(someBeanName);  // delegate work to the Spring Bean delegate.doFilter(request, response); }

FilterChainProxy


image.png

Spring Security的Servlet支持包含在中FilterChainProxy括眠。 FilterChainProxyFilterSpring Security提供的一種特殊功能彪标,它允許Filter通過委派許多實例SecurityFilterChain。由于FilterChainProxy是Bean掷豺,因此通常將其包裝在DelegatingFilterProxy中捞烟。

SecurityFilterChain
SecurityFilterChainFilterChainProxy用于確定Filter應(yīng)對此請求調(diào)用哪些Spring Security 。

image.png

保安過濾器SecurityFilterChain通常是豆類当船,但他們與注冊FilterChainProxy代替的DelegatingFilterProxy题画。 FilterChainProxy直接向Servlet容器或DelegatingFilterProxy注冊具有許多優(yōu)點(diǎn)。首先德频,它為Spring Security的所有Servlet支持提供了一個起點(diǎn)苍息。因此,如果您想對Spring Security的Servlet支持進(jìn)行故障排除壹置,則在其中添加調(diào)試點(diǎn)FilterChainProxy是一個很好的起點(diǎn)竞思。

其次,由于FilterChainProxy對于Spring Security的使用至關(guān)重要钞护,因此它可以執(zhí)行不被視為可選任務(wù)盖喷。例如,它清除SecurityContext以避免內(nèi)存泄漏难咕。它還使用Spring Security HttpFirewall來保護(hù)應(yīng)用程序免受某些類型的攻擊课梳。

另外,它在確定何時SecurityFilterChain調(diào)用a時提供了更大的靈活性步藕。在Servlet容器中惦界,Filter僅根據(jù)URL調(diào)用。但是咙冗,FilterChainProxy可以HttpServletRequest利用RequestMatcher接口根據(jù)任何內(nèi)容確定調(diào)用沾歪。

實際上,FilterChainProxy可以用來確定SecurityFilterChain應(yīng)該使用哪個雾消。如果您的應(yīng)用程序可以為不同的提供完全獨(dú)立的配置灾搏。

image.png

9.5挫望。安全過濾器

  • ChannelProcessingFilter

  • ConcurrentSessionFilter

  • WebAsyncManagerIntegrationFilter

  • SecurityContextPersistenceFilter

  • HeaderWriterFilter

  • CorsFilter

  • CsrfFilter

  • LogoutFilter

  • OAuth2AuthorizationRequestRedirectFilter

  • Saml2WebSsoAuthenticationRequestFilter

  • X509AuthenticationFilter

  • AbstractPreAuthenticatedProcessingFilter

  • CasAuthenticationFilter

  • OAuth2LoginAuthenticationFilter

  • Saml2WebSsoAuthenticationFilter

  • UsernamePasswordAuthenticationFilter

  • ConcurrentSessionFilter

  • OpenIDAuthenticationFilter

  • DefaultLoginPageGeneratingFilter

  • DefaultLogoutPageGeneratingFilter

  • DigestAuthenticationFilter

  • BearerTokenAuthenticationFilter

  • BasicAuthenticationFilter

  • RequestCacheAwareFilter

  • SecurityContextHolderAwareRequestFilter

  • JaasApiIntegrationFilter

  • RememberMeAuthenticationFilter

  • AnonymousAuthenticationFilter

  • OAuth2AuthorizationCodeGrantFilter

  • SessionManagementFilter

  • ExceptionTranslationFilter

  • FilterSecurityInterceptor

  • SwitchUserFilter

處理安全異常

ExceptionTranslationFilter允許的翻譯AccessDeniedExceptionAuthenticationException到HTTP響應(yīng)。

ExceptionTranslationFilter作為安全過濾器之一插入到FilterChainProxy中狂窑。

image.png

  • 1號
    首先媳板,ExceptionTranslationFilter調(diào)用FilterChain.doFilter(request, response)將調(diào)用應(yīng)用程序的其余部分。

  • [圖片上傳失敗...(image-9e46a-1586791805902)] 如果用戶未通過身份驗證或為AuthenticationException泉哈,則Start Authentication.

    • SecurityContextHolder中被清除出

    • HttpServletRequest保存在中RequestCache蛉幸。當(dāng)用戶成功驗證身份后,將RequestCache用于重播原始請求丛晦。

    • AuthenticationEntryPoint用于從客戶機(jī)請求的憑證奕纫。例如,它可能重定向到登錄頁面或發(fā)送WWW-Authenticate標(biāo)題烫沙。

  • 3號
    否則匹层,如果是AccessDeniedException,則拒絕訪問锌蓄。將AccessDeniedHandler被調(diào)用升筏,以拒絕提手接近。

| |

如果應(yīng)用程序未拋出AccessDeniedExceptionAuthenticationException瘸爽,ExceptionTranslationFilter則不執(zhí)行任何操作

ExceptionTranslationFilter偽代碼

try {
    filterChain.doFilter(request, response); 
} catch (AccessDeniedException | AuthenticationException e) {
    if (!authenticated || e instanceof AuthenticationException) {
        startAuthentication(); 
    } else {
        accessDenied(); 
    }
}

| | 你可以從召回進(jìn)展的Filter小號即調(diào)用FilterChain.doFilter(request, response)是等效的調(diào)用應(yīng)用程序的其余部分您访。這意味著如果應(yīng)用程序的另一部分(即FilterSecurityInterceptor方法安全性)拋出AuthenticationExceptionAccessDeniedException,它將在此處被捕獲和處理剪决。 |
| | 如果用戶未通過身份驗證或為AuthenticationException洋只,則開始身份驗證。 |
| | 否則昼捍,訪問被拒絕 |

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市肢扯,隨后出現(xiàn)的幾起案子妒茬,更是在濱河造成了極大的恐慌,老刑警劉巖蔚晨,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件乍钻,死亡現(xiàn)場離奇詭異,居然都是意外死亡铭腕,警方通過查閱死者的電腦和手機(jī)银择,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來累舷,“玉大人浩考,你說我怎么就攤上這事”挥” “怎么了析孽?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵搭伤,是天一觀的道長。 經(jīng)常有香客問我袜瞬,道長怜俐,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任邓尤,我火速辦了婚禮拍鲤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘汞扎。我一直安慰自己季稳,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布佩捞。 她就那樣靜靜地躺著绞幌,像睡著了一般。 火紅的嫁衣襯著肌膚如雪一忱。 梳的紋絲不亂的頭發(fā)上莲蜘,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天,我揣著相機(jī)與錄音帘营,去河邊找鬼票渠。 笑死,一個胖子當(dāng)著我的面吹牛芬迄,可吹牛的內(nèi)容都是我干的问顷。 我是一名探鬼主播,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼禀梳,長吁一口氣:“原來是場噩夢啊……” “哼杜窄!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起算途,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤塞耕,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后嘴瓤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體扫外,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年廓脆,在試婚紗的時候發(fā)現(xiàn)自己被綠了筛谚。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡停忿,死狀恐怖驾讲,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤蝎毡,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布厚柳,位于F島的核電站,受9級特大地震影響沐兵,放射性物質(zhì)發(fā)生泄漏别垮。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一扎谎、第九天 我趴在偏房一處隱蔽的房頂上張望碳想。 院中可真熱鬧,春花似錦毁靶、人聲如沸胧奔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽龙填。三九已至,卻和暖如春拐叉,著一層夾襖步出監(jiān)牢的瞬間岩遗,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工凤瘦, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留宿礁,地道東北人。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓蔬芥,卻偏偏與公主長得像梆靖,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子笔诵,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 身份驗證和訪問控制 應(yīng)用程序安全性歸結(jié)為或多或少的兩個獨(dú)立問題: authentication/認(rèn)證(你是誰返吻?)和...
    ZeralZhang閱讀 625評論 0 0
  • 在Web應(yīng)用程序中的身份驗證 現(xiàn)在讓我們來看看你在Web應(yīng)用程序中使用Spring Security的情況(不啟用...
    kuisasa閱讀 1,255評論 0 1
  • 一、Spring Security簡介 打開Spring Security的官網(wǎng)乎婿,從其首頁的預(yù)覽上就可以看見如下文...
    淚已沾襟化作鴻閱讀 1,608評論 1 11
  • 前言 看了網(wǎng)上各種關(guān)于Spring Security原理解析的文章思喊,大部分都是一上來就貼源碼的,我個人覺得一來就貼...
    f310ff9ba986閱讀 1,847評論 1 18
  • 想念是一種正向的激情 6月次酌,與你初次相識,當(dāng)時我披著黃土地舆乔,灰頭土腦岳服。你滿面霞光,慈眉善眼希俩!你像一縷光照進(jìn)了我的生...
    蘇醒吧小孩閱讀 618評論 0 10