安全性是沒有任何商量余地的。我們要依賴Spring應用程序來傳輸數(shù)據(jù)、驗證憑據(jù)和防止攻擊。采用通過設計實現(xiàn)安全防護的原則將能夠保護我們的網(wǎng)絡避免數(shù)據(jù)被竊取和未經(jīng)授權(quán)的入侵。
《SpringSecurity實戰(zhàn)》展示了如何在造成破壞之前防止跨站腳本和請求偽造攻擊。本書將從基礎開始講解,其中將模擬密碼升級并添加多種類型的授權(quán)。隨著技能的增長,讀者將可以將Spring Security應用到新的架構(gòu)中,并創(chuàng)建高級的OAuth2配置。完成之后,讀者將擁有一個定制的Spring Security配置,它可以保護應用程序免受常見的和特殊的威脅。
主要內(nèi)容
●對密碼進行編碼以及對用戶進行身份驗證
●端點的安全防護
●安全性測試的 自動化
●設置獨立的授權(quán)服務器
本書是一本關(guān)于 Spring Security 的應用指南,主要講解了 Spring Security 的基礎知識點、核心概念,以及圍繞身份驗證和授權(quán)過程的關(guān)鍵處理流程。書中采取了循序漸進、示例輔助的編寫方式,以期讓讀者能夠輕松入門并且隨著對本書的深入閱讀而能穩(wěn)步得到技能提升,同時也逐漸加深對于 Spring Security 和身份驗證以及授權(quán)過程的理解。相信在通讀并深刻理解本書的內(nèi)容之后,讀者就能夠熟練運用 Spring Security對應用程序的各層進行安全配置。本書提供了許多應用示例,并且根據(jù)內(nèi)容結(jié)構(gòu)的編排還提供了 3 個動手實踐的練習章節(jié),這樣,讀者就能通過每一章的知識內(nèi)容并且結(jié)合實踐練習來鞏固所學知識。
本書面向使用 Spring 框架構(gòu)建企業(yè)級應用程序的開發(fā)人員。每個開發(fā)人員都應該從設計階段就開始考慮應用程序的安全性問題。本書將講解如何使用 Spring Security配置應用程序級別的安全保障。使用 Spring 開發(fā)應用程序,開發(fā)人員必須了解如何正確地使用 Spring Security,以及如何在應用程序中應用安全配置。這是非常重要的,如果沒有經(jīng)過體系化的學習和實踐就盲目地借助網(wǎng)絡資源應用 Spring Security,那么所實現(xiàn)的安全配置勢必有所缺失,從而造成應用程序存在漏洞或造成數(shù)據(jù)泄露的嚴重問題。
有鑒于此,建議從事 Spring 應用程序開發(fā)的人員閱讀本書并充分理解其中的內(nèi)容。
前 言
自2008年以來,我一直擔任軟件開發(fā)工程師和軟件開發(fā)培訓師?梢赃@么說,雖然我同時喜歡這兩個角色,但我還是傾向于成為一個培訓師/老師。對我而言,分享知識和幫助他人提高技能一直是我放在首要位置的事情。但我堅信,在這個領(lǐng)域,不能非此即彼。在某種程度上,任何軟件開發(fā)人員都必須扮演培訓師或指導者的角色,如果不首先對如何在真實場景中應用所講授的內(nèi)容有一個透徹的理解,就不能勝任軟件開發(fā)領(lǐng)域的培訓師。
隨著經(jīng)驗的積累,我逐漸理解了非功能性軟件需求的重要性,比如安全性、可維護性、性能等。甚至可以說,我花費在學習非功能性方面的時間比我學習新技術(shù)和框架上的時間還多。實際上,發(fā)現(xiàn)和解決功能性問題通常比解決非功能性問題要容易得多。這可能就是我遇到的許多開發(fā)人員害怕處理混亂的代碼、內(nèi)存相關(guān)問題、多線程設計問題,當然還有安全漏洞的原因所在。
當然,安全性是關(guān)鍵的非功能性軟件特性之一。而Spring Security是當今應用程序中廣泛使用的安全框架之一。這是因為Spring FrameworkSpring生態(tài)系統(tǒng)被認為是Java和JVM領(lǐng)域中用于開發(fā)企業(yè)應用程序的技術(shù)的領(lǐng)導者。
但我特別關(guān)注的是,人們在學習正確使用Spring Security保護應用程序免受常見漏洞侵害時所面臨的困難。人們總是可以在網(wǎng)上找到關(guān)于Spring Security的所有詳細信息。但是,要將它們按照正確的順序組合在一起以便只需花費少的精力就可以使用該框架,還需要花費大量的時間和積累大量的經(jīng)驗。此外,不完整的知識可能會導致人們創(chuàng)建出難以維護和開發(fā)的解決方案,甚至可能暴露安全漏洞。很多時候,從事應用程序開發(fā)的團隊都會向我咨詢,發(fā)現(xiàn)Spring Security使用不當。而且,在許多情況下,其主要原因是對如何使用Spring Security缺乏透徹的理解。
正因為如此,我決定寫一本書來幫助Spring開發(fā)人員理解如何正確使用Spring Security。《Spring Security實戰(zhàn)》應該成為一項資源,幫助那些不了解Spring Security的人逐漸理解它。歸根結(jié)蒂,我希望《Spring Security實戰(zhàn)》能給讀者帶來巨大的價值,讓他們節(jié)省學習Spring Security的時間,以及避免在應用程序中引入所有可能的安全漏洞。
Lauren?iu Spilc?是Endava極為敬業(yè)的一位領(lǐng)導和培訓師,在Endava,他領(lǐng)導著一個為北歐國家的金融市場所開發(fā)的項目。此前,他是一名軟件開發(fā)人員,構(gòu)建了全球廣泛安裝應用的型的企業(yè)資源規(guī)劃解決方案之一。
Lauren?iu堅信,重要的不僅僅是交付高質(zhì)量的軟件,分享知識,幫助他人學習和提高技能也是很重要的。這促使他設計和講授與Java技術(shù)相關(guān)的課程,并且在美國和歐洲各地進行演講以及參與研討會。他的演講活動包括Voxxed Days、TechFlow、Bucharest Technology Week、JavaSkop、Oracle Code Explore、OReilly Software Architecture和Oracle Code One。
目 錄
第I部分 初 識
第1 章 安全性現(xiàn)狀 3
1.1 Spring Security的定義與用途 4
1.2 什么是軟件安全性 7
1.3 安全性為什么重要 12
1.4 Web應用程序中的常見安全漏洞 13
1.4.1 身份驗證和授權(quán)中的漏洞 14
1.4.2 什么是會話固定 15
1.4.3 什么是跨站腳本(XSS) 16
1.4.4 什么是跨站請求偽造(CSRF) 17
1.4.5 理解Web應用程序中的注入漏洞 18
1.4.6 應對敏感數(shù)據(jù)暴露 18
1.4.7 缺乏方法訪問控制指的是什么 21
1.4.8 使用具有已知漏洞的依賴項 23
1.5 各種架構(gòu)中所應用的安全性 23
1.5.1 設計一個單體式Web應用程序 24
1.5.2 為前后端分離設計安全性 25
1.5.3 理解OAuth 2流程 27
1.5.4 使用API鍵、加密簽名和IP驗證保護請求 29
1.6 本書知識內(nèi)容 30
1.7 本章小結(jié) 31
第2 章 Spring Security初探 33
2.1 開始構(gòu)建首個項目 34
2.2 默認配置有哪些 39
2.3 重寫默認配置 43
2.3.1 重寫UserDetailsService組件 44
2.3.2 重寫端點授權(quán)配置 48
2.3.3 以不同方式設置配置 50
2.3.4 重寫AuthenticationProvider實現(xiàn) 54
2.3.5 在項目中使用多個配置類 58
2.4 本章小結(jié) 60
第Ⅱ部分 實現(xiàn)
第3 章 管理用戶 63
3.1 在Spring Security中實現(xiàn)身份驗證 64
3.2 描述用戶 66
3.2.1 闡明UserDetails契約的定義 66
3.2.2 GrantedAuthority契約詳述 68
3.2.3 編寫UserDetails的小化實現(xiàn) 69
3.2.4 使用構(gòu)造器創(chuàng)建UserDetails類型的實例 72
3.2.5 合并與用戶相關(guān)的多個職能 73
3.3 指示Spring Security如何管理用戶 77
3.3.1 理解UserDetailsService契約 77
3.3.2 實現(xiàn)UserDetailsService契約 78
3.3.3 實現(xiàn)UserDetailsManager契約 82
3.4 本章小結(jié) 90
第4 章 密碼處理 91
4.1 理解PasswordEncoder契約 91
4.1.1 PasswordEncoder契約的定義 92
4.1.2 實現(xiàn)PasswordEncoder契約 93
4.1.3 從PasswordEncoder提供的實現(xiàn)中選擇 95
4.1.4 使用DelegatingPasswordEncoder實現(xiàn)多種編碼策略 98
4.2 Spring Security Crypto模塊的更多知識 102
4.2.1 使用密鑰生成器 102
4.2.2 將加密器用于加密和解密操作 104
4.3 本章小結(jié) 106
第5 章 實現(xiàn)身份驗證 107
5.1 理解AuthenticationProvider 109
5.1.1 在身份驗證期間表示請求 110
5.1.2 實現(xiàn)自定義身份驗證邏輯 111
5.1.3 應用自定義身份驗證邏輯 113
5.2 使用SecurityContext 117
5.2.1 將一種保持策略用于安全上下文 119
5.2.2 將保持策略用于異步調(diào)用 121
5.2.3 將保持策略用于獨立應用程序 123
5.2.4 使用DelegatingSecurityContextRunnable轉(zhuǎn)發(fā)安全上下文 124
5.2.5 使用DelegatingSecurityContextExecutorService轉(zhuǎn)發(fā)安全上下文 127
5.3 理解HTTP Basic和基于表單的登錄身份驗證 129
5.3.1 使用和配置HTTP Basic 130
5.3.2 使用基于表單的登錄實現(xiàn)身份驗證 133
5.4 本章小結(jié) 140
第6 章 動手實踐:一個小型且安全的Web應用程序 141
6.1 項目需求和設置 141
6.2 實現(xiàn)用戶管理 148
6.3 實現(xiàn)自定義身份驗證邏輯 153
6.4 實現(xiàn)主頁面 156
6.5 運行和測試應用程序 159
6.6 本章小結(jié) 161
第7 章 配置權(quán)限:限制訪問 163
7.1 基于權(quán)限和角色限制訪問 165
7.1.1 基于用戶權(quán)限限制所有端點的訪問 167
7.1.2 基于用戶角色限制所有端點的訪問 175
7.1.3 限制對所有端點的訪問 180
7.2 本章小結(jié) 183
第8 章 配置權(quán)限:應用限制 185
8.1 使用匹配器方法選擇端點 185
8.2 使用MVC匹配器選擇用于授權(quán)的請求 192
8.3 使用Ant匹配器選擇用于授權(quán)的請求 200
8.4 使用正則表達式匹配器選擇用于授權(quán)的請求 204
8.5 本章小結(jié) 210
第9 章 實現(xiàn)過濾器 211
9.1 在Spring Security架構(gòu)中實現(xiàn)過濾器 213
9.2 在過濾器鏈中現(xiàn)有過濾器之前添加過濾器 215
9.3 在過濾器鏈中已有的過濾器之后添加過濾器 219
9.4 在過濾器鏈中另一個過濾器的位置添加一個過濾器 222
9.5 Spring Security提供的Filter實現(xiàn) 227
9.6 本章小結(jié) 229
第10 章 應用CSRF防護和CORS 231
10.1 在應用程序中應用跨站請求偽造(CSRF)防護 231
10.1.1 CSRF防護如何在Spring Security中發(fā)揮作用 232
10.1.2 在實際場景中使用CSRF防護 238
10.1.3 自定義CSRF防護 244
10.2 使用跨源資源共享 255
10.2.1 CORS的運行機制 256
10.2.2 使用@CrossOrigin注解應用CORS策略 261
10.2.3 使用CorsConfigurer應用CORS 262
10.3 本章小結(jié) 263
第11 章 動手實踐:職責分離 265
11.1 示例的場景和需求 266
11.2 實現(xiàn)和使用令牌 269
11.2.1 令牌是什么 269
11.2.2 JSON Web Token是什么 272
11.3 實現(xiàn)身份驗證服務器 274
11.4 實現(xiàn)業(yè)務邏輯服務器 285
11.4.1 實現(xiàn)Authentication對象 290
11.4.2 實現(xiàn)身份驗證服務器的代理 292
11.4.3 實現(xiàn)AuthenticationProvider接口 295
11.4.4 實現(xiàn)過濾器 297
11.4.5 編寫安全性配置 304
11.4.6 測試整個系統(tǒng) 306
11.5 本章小結(jié) 307
第12 章 OAuth 2的運行機制 309
12.1 OAuth 2框架 310
12.2 OAuth 2身份驗證架構(gòu)的組件 312
12.3 使用OAuth 2的實現(xiàn)選項 313
12.3.1 實現(xiàn)授權(quán)碼授權(quán)類型 313
12.3.2 實現(xiàn)密碼授權(quán)類型 318
12.3.3 實現(xiàn)客戶端憑據(jù)授權(quán)類型 320
12.3.4 使用刷新令牌獲得新的訪問令牌 321
12.4 OAuth 2的弱點 323
12.5 實現(xiàn)一個簡單的單點登錄應用程序 324
12.5.1 管理授權(quán)服務器 325
12.5.2 開始實現(xiàn) 328
12.5.3 實現(xiàn)ClientRegistration 330
12.5.4 實現(xiàn)ClientRegistrationRepository 333
12.5.5 Spring Boot配置的純粹方式 335
12.5.6 獲取經(jīng)過身份驗證的用戶的詳細信息 337
12.5.7 測試應用程序 338
12.6 本章小結(jié) 341
第13 章 OAuth 2:實現(xiàn)授權(quán)服務器 343
13.1 編寫我們自己的授權(quán)服務器實現(xiàn) 345
13.2 定義用戶管理 346
13.3 向授權(quán)服務器注冊客戶端 349
13.4 使用密碼授權(quán)類型 353
13.5 使用授權(quán)碼授權(quán)類型 355
13.6 使用客戶端憑據(jù)授權(quán)類型 361
13.7 使用刷新令牌授權(quán)類型 364
13.8 本章小結(jié) 366
第14 章 OAuth 2:實現(xiàn)資源服務器 367
14.1 實現(xiàn)資源服務器 369
14.2 遠程檢查令牌 372
14.3 實現(xiàn)帶有JdbcTokenStore的黑板模式 380
14.4 兩種方法的簡要對比 389
14.5 本章小結(jié) 390
第15 章 OAuth 2:使用JWT和加密簽名 391
15.1 使用JWT以及對稱密鑰簽名的令牌 391
15.1.1 使用JWT 392
15.1.2 實現(xiàn)授權(quán)服務器以頒發(fā)JWT 393
15.1.3 實現(xiàn)使用JWT的資源服務器 398
15.2 使用通過JWT和非對稱密鑰簽名的令牌 402
15.2.1 生成密鑰對 403
15.2.2 實現(xiàn)使用私鑰的授權(quán)服務器 405
15.2.3 實現(xiàn)使用公鑰的資源服務器 407
15.2.4 使用一個暴露公鑰的端點 409
15.3 將自定義詳細信息添加到JWT 413
15.3.1 配置授權(quán)服務器以便向令牌添加自定義詳細信息 414
15.3.2 配置資源服務器以讀取JWT的自定義詳細信息 416
15.4 本章小結(jié) 419
第16 章 全局方法安全性:預授權(quán)和后授權(quán) 421
16.1 啟用全局方法安全性 422
16.1.1 理解調(diào)用授權(quán) 422
16.1.2 在項目中啟用全局方法安全性 425
16.2 對權(quán)限和角色應用預授權(quán) 426
16.3 應用后授權(quán) 431
16.4 實現(xiàn)方法的許可 436
16.5 本章小結(jié) 448
第17 章 全局方法安全性:預過濾和后過濾 451
17.1 為方法權(quán)限應用預過濾 452
17.2 為方法授權(quán)應用后過濾 459
17.3 在Spring Data存儲庫中使用過濾 463
17.4 本章小結(jié) 470
第18 章 動手實踐:一個OAuth 2 應用程序 471
18.1 應用程序場景 472
18.2 將Keycloak配置為授權(quán)服務器 474
18.2.1 為系統(tǒng)注冊一個客戶端 478
18.2.2 指定客戶端作用域 479
18.2.3 添加用戶并獲取訪問令牌 481
18.2.4 定義用戶角色 485
18.3 實現(xiàn)資源服務器 490
18.4 對應用程序進行測試 501
18.4.1 證明經(jīng)過身份驗證的用戶只能為自己添加記錄 502
18.4.2 證明用戶只能檢索自己的記錄 504
18.4.3 證明只有管理員才能刪除記錄 505
18.5 本章小結(jié) 506
第19 章 在反應式應用程序中使用Spring Security 509
19.1 什么是反應式應用程序 510
19.2 反應式應用程序中的用戶管理 514
19.3 在反應式應用程序中配置授權(quán)規(guī)則 519
19.3.1 在反應式應用程序的端點層應用授權(quán) 520
19.3.2 在反應式應用程序中使用方法安全性 526
19.4 反應式應用程序和OAuth 2 529
19.5 本章小結(jié) 532
第20 章 Spring Security測試 535
20.1 使用模擬用戶進行測試 537
20.2 使用UserDetailsService提供的用戶進行測試 545
20.3 將自定義Authentication對象用于測試 547
20.4 測試方法安全性 551
20.5 測試身份驗證 552
20.6 測試CSRF配置 556
20.7 測試CORS配置 557
20.8 測試反應式Spring Security實現(xiàn) 558
20.9 本章小結(jié) 561
附錄A 創(chuàng)建一個Spring Boot
項目 563