javascript
使用Spring Boot和MongoDB构建一个React式应用程序
“我喜歡編寫身份驗證和授權(quán)代碼?!??從來沒有Java開發(fā)人員。 厭倦了一次又一次地建立相同的登錄屏幕? 嘗試使用Okta API進行托管身份驗證,授權(quán)和多因素身份驗證。
如果您要處理大量流數(shù)據(jù),React式應(yīng)用程序可讓您更好地擴展。 它們是非阻塞的,并且往往效率更高,因為它們在等待發(fā)生事情時不會占用處理能力。
React系統(tǒng)包含異步I / O。 異步I / O背后的概念很簡單:通過回收本來會在等待I / O活動時處于空閑狀態(tài)的資源來減輕資源利用效率的降低。 異步I / O顛倒了I / O處理的常規(guī)設(shè)計:向客戶端通知新數(shù)據(jù)而不是請求新數(shù)據(jù); 這樣可以使客戶在等待時可以做其他事情。
如果要構(gòu)建React式應(yīng)用程序,則需要它一直到整個數(shù)據(jù)庫都是React式的。 將阻塞的JDBC驅(qū)動程序與Spring WebFlux一起使用,您會對其性能感到失望。 使用React性NoSQL數(shù)據(jù)庫(例如Cassandra,MongoDB,Couchbase和Redis),其性能將給您留下深刻的印象。
在本教程中,您將學(xué)習(xí)如何使用Spring Boot,Spring WebFlux和Spring Data創(chuàng)建與NoSQL數(shù)據(jù)庫后端(在本例中為MongoDB)通信的React式Web服務(wù)。
我只是對你說了幾句。 讓我們越過它們。
如果您已經(jīng)了解NoSQL和Reactive編程,并且只想看一些代碼,請隨時跳過前兩部分,并從“構(gòu)建Spring Boot資源服務(wù)器”開始。
注意:本系列的第一部分演示了如何將Spring Boot和Spring Data與關(guān)系數(shù)據(jù)庫PostgreSQL一起使用。 您可以在此處查看該帖子。
什么是NoSQL?為什么使用MongoDB?
NoSQL是任何非關(guān)系數(shù)據(jù)庫的術(shù)語。 在關(guān)系數(shù)據(jù)庫(例如SQL,MySQL等)中,數(shù)據(jù)存儲在具有強類型且表列之間關(guān)系明確的表中。 關(guān)系數(shù)據(jù)庫的緊密,定義明確的結(jié)構(gòu)既是優(yōu)點也是缺點。 這是一個權(quán)衡。 NoSQL數(shù)據(jù)庫使該模型爆炸式增長,并提供了其他模型,這些模型可提供更大的靈活性并易于擴展。
擴展的微服務(wù)/集群模型為關(guān)系數(shù)據(jù)庫帶來了很多問題。 它們并不是為在多臺計算機上運行和保持同步而設(shè)計的。 開發(fā)NoSQL數(shù)據(jù)庫部分是為了解決此問題。 通常,在構(gòu)建它們時會考慮群集和水平縮放。 為了以另一種方式展示這種方式(通常是使用SQL數(shù)據(jù)庫),如果需要更多功能,則必須調(diào)整數(shù)據(jù)庫運行所在的服務(wù)器的大小。 它幾乎是單片的,并且即使當(dāng)今有所有現(xiàn)代的虛擬服務(wù)器時髦功能,也很難動態(tài)地做到這一點。 在Internet規(guī)模上,更好的模型是擁有一個靈活的數(shù)據(jù)庫集群,它們可以在數(shù)據(jù)庫之間自動同步,并允許您根據(jù)需求增加實例(并在需求減少時減少實例)。 這意味著增加功率并不需要更昂貴的機器。 您可以根據(jù)需要簡單地添加更多,相對便宜的計算機。
NoSQL數(shù)據(jù)庫的另一個潛在好處是它們的靈活性。 像MongoDB這樣的基于文檔的NoSQL數(shù)據(jù)庫可以在文檔中存儲任意數(shù)據(jù)。 可以將字段動態(tài)添加到存儲的文檔中,而無需增加表遷移的開銷。 當(dāng)然,這并不能解決版本控制的問題,仍然取決于應(yīng)用程序來處理不斷變化的數(shù)據(jù)結(jié)構(gòu)(并不總是瑣碎的),但是至少您并沒有與數(shù)據(jù)庫打架。
綜上所述,請記住,SQL /關(guān)系數(shù)據(jù)庫不會隨處可見。 它們經(jīng)過驗證,快速且超級可靠。 在某些情況下,它們更便宜,更容易。 例如,對于簡單的網(wǎng)站或博客,MySQL很難被擊敗。 但是即使在企業(yè)環(huán)境中, 有時您也想要關(guān)系數(shù)據(jù)庫強制執(zhí)行的結(jié)構(gòu)。 如果您有一個相當(dāng)靜態(tài)的數(shù)據(jù)模型并且不需要擴展到Internet規(guī)模,則SQL可能是最佳選擇。 這些類型的設(shè)計注意事項值得您考慮,因為它是新的且浮華的,因此在您選擇數(shù)據(jù)庫之前。
我在本教程中使用的是MongoDB,因為開始時很容易。 如果您使用Spring Data MongoDB,它甚至更容易!
積極React!
React性是另一種行話。 感覺就像人們喜歡在聚會和會議上亂扔一詞一樣,只是對它的實際含義含糊其詞。 就像“存在的”或“ ennui”。 讓我們定義它。
如果您看一下Spring WebFlux文檔 ,它們會很好地概述什么是React性 。
術(shù)語“React性”是指圍繞響應(yīng)變化而構(gòu)建的編程模型-網(wǎng)絡(luò)組件響應(yīng)I / O事件,UI控制器響應(yīng)鼠標(biāo)事件等。 從這個意義上講,非阻塞是React性的,因為隨著操作完成或數(shù)據(jù)可用,我們現(xiàn)在處于響應(yīng)通知的模式,而不是被阻塞。
因此,React式意味著:非阻塞,異步且以流處理為中心。
構(gòu)建一個Spring Boot資源服務(wù)器
從GitHub存儲庫克隆啟動項目,并檢出start分支:
git clone -b start https://github.com/oktadeveloper/okta-spring-boot-mongo-webflux-example.git入門項目是一個簡單的Spring Boot入門項目,在build.gradle文件中已經(jīng)具有必需的依賴build.gradle 。
讓我們快速看一下相關(guān)性:
compile('org.springframework.boot:spring-boot-starter-webflux') compile('org.springframework.boot:spring-boot-starter-data-mongodb-reactive') compileOnly('org.projectlombok:lombok') compile('de.flapdoodle.embed:de.flapdoodle.embed.mongo')第一個是針對Spring WebFlux(Spring MVC的響應(yīng)版本)。 第二個引入了Spring需要的React性MongoDB依賴關(guān)系。 第三個是名為Lombok的項目,該項目使我們不必在Java代碼中鍵入一堆構(gòu)造函數(shù),getter和setter(您可以在其網(wǎng)頁上查看該項目)。 最后一個依賴項是嵌入式內(nèi)存MongoDB數(shù)據(jù)庫。 該數(shù)據(jù)庫非常適合測試,像這樣的簡單教程,并且不持久。
可以使用簡單的Gradle命令運行該應(yīng)用程序:
./gradlew bootRun當(dāng)然,如果您此時運行該應(yīng)用程序,則不會做太多事情。 Spring Boot將加載,但是還沒有定義任何控制器,資源或存儲庫,因此沒有太多事情發(fā)生。
為MongoDB定義模型類
為了清楚起見,本教程將與我之前提到的本系列的第一部分并行。 您將要構(gòu)建一個存儲皮劃艇類型的簡單服務(wù)器。 我總是建議首先定義數(shù)據(jù)結(jié)構(gòu)來開始任何項目。
在com.okta.springbootmongo包中創(chuàng)建一個Kayak.java類文件:
package com.okta.springbootmongo; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import org.springframework.data.mongodb.core.mapping.Document; @Document @Data @AllArgsConstructor @NoArgsConstructor public class Kayak { private String name; private String owner; private Number value; private String makeModel; }@Document注釋與@Entity的NoSQL等效。 它告訴Spring Boot此類正在定義數(shù)據(jù)模型。 在NoSQL世界中,這意味著創(chuàng)建文檔而不是表條目。 其他三個注釋是Lombok幫助程序,它們自動生成getter,setter和構(gòu)造函數(shù)。
皮劃艇文檔具有五個屬性:名稱,所有者,值和類型。 這些會自動映射到適用于MongoDB的BSON類型。 什么是BSON類型? 看看有關(guān)該主題的MongoDB文檔 。 它們是用于將數(shù)據(jù)保留在MongoDB文檔中的二進制序列化類型。 它們定義了可以存儲在MongoDB數(shù)據(jù)庫中的原始類型。
將ReactiveMongoRepository添加到您的Spring Boot應(yīng)用程序
用@Document批注定義Kayak類會告訴Spring Boot數(shù)據(jù)的結(jié)構(gòu),但實際上并沒有提供任何從數(shù)據(jù)庫保存或加載數(shù)據(jù)的方法。 為此,您需要定義一個存儲庫。
該代碼非常簡單。 在com.okta.springbootmongo包中創(chuàng)建一個KayakRepository.java類文件:
package com.okta.springbootmongo; import org.springframework.data.mongodb.repository.ReactiveMongoRepository; public interface KayakRepository extends ReactiveMongoRepository<Kayak, Long> { }實際上,這為您提供了從數(shù)據(jù)庫創(chuàng)建,更新,讀取和刪除文檔所需的所有基本方法。 要了解操作方法,請深入研究ReactiveMongoRepository類和其他各種超類,尤其是ReactiveCrudRepository 。 查看ReactiveCrudRepository 的文檔以查看已實現(xiàn)的方法。
ReactiveCrudRepository實際上提供了一組基本而完整的CRUD方法。 ReactiveMongoRepository在此基礎(chǔ)上構(gòu)建,以提供一些特定于MongoDB的查詢功能。
使用Spring WebFlux實現(xiàn)控制器
添加存儲庫后,您有足夠的能力以編程方式處理數(shù)據(jù)。 但是,沒有定義Web端點。 在前面的教程中,添加REST端點,這是需要的所有是對加@RepositoryRestResource注釋到KayakRepository類。 這通過所有CRUD方法為我們自動生成了功能齊全的REST資源。 但是,此快捷方式不適用于Spring WebFlux。 必須明確定義任何公共Web終結(jié)點。
添加以下KayakController.java類
package com.okta.springbootmongo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; import reactor.core.publisher.Flux; @Controller @RequestMapping(path = "/kayaks") public class KayakController { private KayakRepository kayakRepository; public KayakController(KayakRepository kayakRepository) {this.kayakRepository = kayakRepository;}@PostMapping() public @ResponseBody Mono<Kayak> addKayak(@RequestBody Kayak kayak) { return kayakRepository.save(kayak); } @GetMapping() public @ResponseBody Flux<Kayak> getAllKayaks() { return kayakRepository.findAll(); } }該控制器添加了兩個端點:
- POST /kayaks增加了新的皮劃艇
- GET /kayaks列出所有皮劃艇
您還將注意到,該類使用Spring依賴項注入將KayakRepository實例自動裝配到控制器中,并且您將看到如何使用存儲庫持久化Kayak域類。
此類看起來非常像關(guān)系的,阻塞的版本。 許多幕后工作使這種情況成為現(xiàn)實。 不用擔(dān)心,這是100%React性的非阻塞代碼。
測試您的Spring Boot服務(wù)器
至此,您已經(jīng)可以完全運行皮劃艇REST資源服務(wù)器。 在測試之前,請將以下方法添加到MainApplication類。 當(dāng)應(yīng)用程序加載時,這只是將一些測試數(shù)據(jù)注入數(shù)據(jù)庫。
@Bean ApplicationRunner init(KayakRepository repository) { Object[][] data = { {"sea", "Andrew", 300.12, "NDK"}, {"creek", "Andrew", 100.75, "Piranha"}, {"loaner", "Andrew", 75, "Necky"} }; return args -> { repository .deleteAll() .thenMany( Flux .just(data) .map(array -> { return new Kayak((String) array[0], (String) array[1], (Number) array[2], (String) array[3]); }) .flatMap(repository::save) ) .thenMany(repository.findAll()) .subscribe(kayak -> System.out.println("saving " + kayak.toString()));}; }HTTPie是一個很棒的命令行實用程序,可以輕松地對資源服務(wù)器運行請求。 如果未安裝HTTPie,請使用brew install httpie進行brew install httpie 。 或前往他們的網(wǎng)站并實現(xiàn)它。 或者只是跟隨。
確保您的Spring Boot應(yīng)用正在運行。 如果不是,請使用./gradlew bootRun啟動它。
針對您的資源服務(wù)器運行GET請求: http :8080/kayaks ,這是http GET http://localhost:8080/kayaks簡寫。
您將獲得:
HTTP/1.1 200 OK Content-Type: application/json;charset=UTF-8 transfer-encoding: chunked [{"makeModel": "NDK","name": "sea","owner": "Andrew","value": 300.12},{"makeModel": "Piranha","name": "creek","owner": "Andrew","value": 100.75},{"makeModel": "Necky","name": "loaner","owner": "Andrew","value": 75} ]現(xiàn)在嘗試將新的皮劃艇過帳到服務(wù)器。
http POST :8080/kayaks name="sea2" owner="Andrew" value="500" makeModel="P&H"您應(yīng)該看到:
HTTP/1.1 200 OK Content-Length: 62 Content-Type: application/json;charset=UTF-8 {"makeModel": "P&H","name": "sea2","owner": "Andrew","value": 500 }如果您重復(fù)GET請求http :8080/kayaks ,您將在列表中看到新的皮劃艇!
設(shè)置安全認(rèn)證
現(xiàn)在,您需要集成Okta for OAuth 2.0并將基于令牌的身份驗證添加到資源服務(wù)器。 本部分與本教程第1部分中的部分完全相同,因此,如果您已完成此操作,則只需要您的Client ID,就可以跳到下一部分。
如果還沒有,請訪問developer.okta.com并注冊一個免費帳戶。 擁有帳戶后,通過單擊“ 應(yīng)用程序”頂部菜單項,然后單擊“ 添加應(yīng)用程序”按鈕,打開開發(fā)人員儀表板并創(chuàng)建OpenID Connect(OIDC)應(yīng)用程序 。
選擇單頁應(yīng)用程序 。
默認(rèn)應(yīng)用程序設(shè)置很好,除了您需要添加登錄重定向URI : https://oidcdebugger.com/debug : https://oidcdebugger.com/debug 。 您將在稍后使用它來檢索測試令牌。
注意 :如果要實現(xiàn)像Angular或React這樣的前端,則可能需要根據(jù)所使用的平臺來更新默認(rèn)的登錄重定向URI。 由于本教程僅創(chuàng)建沒有前端的資源服務(wù)器,因此暫時不重要。 我們所有的資源服務(wù)器將要做的就是使用授權(quán)服務(wù)器來驗證JSON Web令牌,而無需重定向。
另外,請注意您的客戶ID ,稍后您將需要它。
配置您的Spring Boot服務(wù)器以進行令牌認(rèn)證
現(xiàn)在,您需要更新一些項目文件以為OAuth 2.0配置Spring Boot。
將以下依賴項添加到build.gradle文件中:
dependencies {...compile('com.okta.spring:okta-spring-boot-starter:1.1.0')... }創(chuàng)建一個名為src/main/resources/application.yml的新配置文件
okta:oauth2:issuer: https://{yourOktaDomain}/oauth2/defaultgroupsClaim: groupsclientId: {yourClientId}在com.okta.springbootmongo包中創(chuàng)建一個SecurityConfiguration.java類:
package com.okta.springbootmongo;import org.springframework.context.annotation.Bean; import org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity; import org.springframework.security.config.web.server.ServerHttpSecurity; import org.springframework.security.web.server.SecurityWebFilterChain;@EnableWebFluxSecurity public class SecurityConfiguration {@Beanpublic SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity http) {http.authorizeExchange().anyExchange().authenticated().and().oauth2ResourceServer().jwt();return http.build();} }測試您的受保護服務(wù)器
停止您的Spring Boot服務(wù)器并使用以下./gradlew bootRun重新啟動它: ./gradlew bootRun
在命令行中,運行一個簡單的GET請求。
http :8080/kayaks您會得到未經(jīng)授權(quán)的401 /。
HTTP/1.1 401 Unauthorized Cache-Control: no-store Content-Type: application/json;charset=UTF-8生成訪問令牌
要立即訪問服務(wù)器,您需要一個有效的訪問令牌。 您可以使用OpenID Connect調(diào)試器來幫助您完成此任務(wù)。 在另一個窗口中,打開oidcdebugger.com 。
- 授權(quán)URI : https://{yourOktaDomain} /oauth2/default/v1/authorize
- 重定向URI :不變。 這是您在上面的OIDC應(yīng)用程序中添加的值。
- 客戶ID :來自您剛創(chuàng)建的OIDC應(yīng)用程序。
- 范圍 : openid profile email 。
- 狀態(tài) :您要通過OAuth重定向過程傳遞的任何值。 我將其設(shè)置為{} 。
- Nonce :可以一個人呆著。 Nonce表示“編號已使用一次”,是一種簡單的安全措施,用于防止同一請求被多次使用。
- 響應(yīng)類型 : token 。
- 響應(yīng)方式 : form_post 。
點擊發(fā)送請求 。 如果您尚未登錄developer.okta.com,則需要登錄。如果(可能的話)已經(jīng)登錄,則會為您的登錄身份生成令牌。
使用您的訪問令牌
您可以通過在Bearer類型的Authorization請求標(biāo)頭中包含令牌來使用令牌。
將令牌存儲在shell變量中:
TOKEN=eyJraWQiOiJldjFpay1DS3UzYjJXS3QzSVl1MlJZc3VJSzBBYUl3NkU4SDJfNVJr...然后使用HTTPie發(fā)出GET請求:
http :8080/kayaks "Authorization: Bearer $TOKEN"請注意上面的雙引號。 單引號不起作用,因為shell變量未擴展。
添加基于組的授權(quán)
現(xiàn)在,您將通過添加基于組成員身份來控制對特定控制器端點的訪問的功能,來使授權(quán)方案更加完善。
要將基于組的授權(quán)與Okta一起使用,您需要在訪問令牌中添加一個“組”聲明。 創(chuàng)建一個Admin組( Users > Groups > Add Group )并將您的用戶添加到其中。 您可以使用注冊時使用的帳戶,也可以創(chuàng)建一個新用戶(“ 用戶” >“ 添加人” )。 導(dǎo)航到“ API” >“ 授權(quán)服務(wù)器” ,單擊“ 授權(quán)服務(wù)器”選項卡,然后編輯默認(rèn)選項卡。 點擊索賠標(biāo)簽,然后添加索賠 。 將其命名為“組”,并將其包含在訪問令牌中。 將值類型設(shè)置為“ Groups”,并將過濾器設(shè)置為.*的正則表達(dá)式。
組聲明包含用戶分配到的組。 您用來登錄developer.okta.com網(wǎng)站的默認(rèn)用戶也將是“所有人”組和“管理員”組的成員。
還需要更新SecurityConfiguration類以使用基于組的授權(quán)。 更新Java文件以匹配以下內(nèi)容:
package com.okta.springbootmongo;import org.springframework.context.annotation.Bean; import org.springframework.http.HttpMethod; import org.springframework.security.config.annotation.method.configuration.EnableReactiveMethodSecurity; import org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity; import org.springframework.security.config.web.server.ServerHttpSecurity; import org.springframework.security.web.server.SecurityWebFilterChain;@EnableWebFluxSecurity @EnableReactiveMethodSecurity public class SecurityConfiguration {@Beanpublic SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity http) {http.authorizeExchange().pathMatchers(HttpMethod.POST, "/kayaks/**").hasAuthority("Admin").anyExchange().authenticated().and().oauth2ResourceServer().jwt();return http.build();} }用簡單的英語來說,這告訴Spring Boot要求對/kayak端點的任何POST都具有組成員身份Admin ,對于所有其他請求,僅需要有效的JWT。
您的基于組的授權(quán)策略由以下兩行定義:
.pathMatchers(HttpMethod.POST, "/kayaks/**").hasAuthority("Admin") .anyExchange().authenticated()有關(guān)更多信息,請參閱ServerHttpSecurity類的文檔 。
您可能想知道為什么它說hasAuthority()而不是hasRole()或hasGroup() 。 這是因為授權(quán)是Spring調(diào)用服務(wù)器發(fā)送的文本字符串來表示權(quán)限成員身份的方式,無論是角色還是組。 hasRole()假定角色采用特定格式:“ ROLE_ADMIN”。 可以重寫此方法,但是hasAuthority()是直接使用授權(quán)字符串的簡單方法。 沒有hasGroup()方法,因為前兩個示例(如果未明確說明)涵蓋了此用例。
創(chuàng)建一個非管理員用戶
要測試基于組的授權(quán)方案,您需要一個不是管理員的用戶。 轉(zhuǎn)到developer.okta.com儀表板。
從頂部菜單中,選擇“ 用戶” >“ 人員” 。 單擊添加人按鈕。
給用戶一個名字 , 姓氏和用戶名 (也將是主要電子郵件 )。 值無關(guān)緊要,您將無需檢查電子郵件。 您只需要知道電子郵件地址/用戶名和密碼,即可在一分鐘內(nèi)登錄Okta。
密碼 :將下拉菜單更改為“ 由管理員設(shè)置” 。
為用戶分配密碼。
點擊保存 。
您剛剛創(chuàng)建的用戶不是Admin組的成員,而是默認(rèn)組Everyone的成員。
基于測試組的授權(quán)
注銷您的Okta開發(fā)人員儀表板。
返回OIDC調(diào)試器并生成一個新令牌。
這次,以新的非管理員用戶身份登錄。 系統(tǒng)會要求您選擇一個安全問題,然后將您重定向到https://oidcdebugger.com/debug頁面,您可以在其中復(fù)制令牌。
如果愿意,可以轉(zhuǎn)到j(luò)sonwebtoken.io并解碼新令牌。 在有效負(fù)載中, 子聲明將顯示用戶的電子郵件/用戶名,而組聲明將僅顯示“ 所有人”組。
{"sub": "test@gmail.com","groups": ["Everyone"] }根據(jù)許可方案,該用戶應(yīng)該能夠列出所有皮劃艇,但不能添加新的皮劃艇。
請記住,將令牌存儲在shell腳本中,如下所示:
TOKEN=eyJraWQiOiI4UlE5REJGVUJOTnJER0VGaEExekd6bWJqREpSYTRTT1lhaGpsM3d4...發(fā)出GET請求以列出所有皮劃艇:
http :8080/kayaks "Authorization: Bearer $TOKEN"HTTP/1.1 200 OK Cache-Control: no-cache, no-store, max-age=0, must-revalidate Content-Type: application/json;charset=UTF-8 ...[{"makeModel": "NDK","name": "sea","owner": "Andrew","value": 300.12},{"makeModel": "Necky","name": "loaner","owner": "Andrew","value": 75},{"makeModel": "Piranha","name": "creek","owner": "Andrew","value": 100.75} ]嘗試使用非管理員用戶令牌添加新的皮劃艇:
http POST :8080/kayaks "Authorization: Bearer $TOKEN" name="sea2" owner="Andrew" value="500" makeModel="P&H"您將被拒絕!
HTTP/1.1 403 Forbidden Cache-Control: no-cache, no-store, max-age=0, must-revalidate Expires: 0 ...現(xiàn)在,注銷developer.okta.com,并使用OIDC Debugger生成一個新令牌。 這次使用您原來的管理員帳戶重新登錄。
將新令牌存儲在shell變量TOKEN 。
運行POST請求:
http POST :8080/kayaks "Authorization: Bearer $TOKEN" name="sea2" owner="Andrew" value="500" makeModel="P&H"AM! 💥
HTTP/1.1 200 OK Cache-Control: no-cache, no-store, max-age=0, must-revalidate ... {"makeModel": "P&H","name": "sea2","owner": "Andrew","value": 500 }一切順利,已通過身份驗證
而已! 在本教程中,您使用Spring WebFlux創(chuàng)建了一個Spring Boot應(yīng)用程序,使用嵌入式MongoDB數(shù)據(jù)庫來持久化模型類,并向其中添加了資源服務(wù)器。 之后,我向您展示了如何使用Okta和OAuth 2.0添加JWT令牌身份驗證。 最后,您了解了如何使用Okta和Spring Security將基于組的授權(quán)添加到控制器中的特定端點。
如果您想查看這個完整的項目,可以在oktadeveloper / okta-spring-boot-mongo-webflux-example上的GitHub上找到該倉庫 。
如果還沒有,請查看本系列的第1部分: 使用PostgreSQL使用Spring Boot和JPA構(gòu)建基本應(yīng)用程序 。 它是同一個應(yīng)用程序,但是使用了更傳統(tǒng)的關(guān)系數(shù)據(jù)庫和Spring MVC樣式的阻止Web服務(wù)器。
了解有關(guān)Spring Boot,MongoDB和安全用戶管理的更多信息
如果您想了解有關(guān)Spring Boot,Spring Security或Okta的更多信息,請查看以下任何出色的教程:
- 使用Spring WebFlux構(gòu)建React性API
- Spring Boot,OAuth 2.0和Okta入門
- 15分鐘內(nèi)將單一登錄添加到您的Spring Boot Web App
- 使用多重身份驗證保護您的Spring Boot應(yīng)用程序安全
- 使用Spring Boot和GraphQL構(gòu)建安全的API
以下是一些來自Spring的優(yōu)秀資源:
- 對Spring Data做出React
- OAuth2 WebFlux文檔
- 構(gòu)建React式RESTful Web服務(wù)
- Spring WebFlux文檔
如果您喜歡這篇文章,您可能會喜歡我們發(fā)布的其他文章。 在Twitter上關(guān)注@oktadev ,并訂閱我們的YouTube頻道以獲取更多有趣的教程。
“使用Spring Boot和MongoDB構(gòu)建響應(yīng)式應(yīng)用程序”最初于2019年2月21日發(fā)布在Okta開發(fā)人員博客上。
“我喜歡編寫身份驗證和授權(quán)代碼?!??從來沒有Java開發(fā)人員。 厭倦了一次又一次地建立相同的登錄屏幕? 嘗試使用Okta API進行托管身份驗證,授權(quán)和多因素身份驗證。
翻譯自: https://www.javacodegeeks.com/2019/03/build-reactive-app-spring-boot-mongodb.html
總結(jié)
以上是生活随笔為你收集整理的使用Spring Boot和MongoDB构建一个React式应用程序的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 周深新歌望歌词是什么 周深新歌望的歌词
- 下一篇: 词典的英文怎么读 词典的英文怎样说
