日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

使用Spring Boot和MongoDB构建一个反应式应用程序

發(fā)布時(shí)間:2023/12/3 javascript 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用Spring Boot和MongoDB构建一个反应式应用程序 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

“我喜歡編寫身份驗(yàn)證和授權(quán)代碼。” ?從來沒有Java開發(fā)人員。 厭倦了一次又一次地建立相同的登錄屏幕? 嘗試使用Okta API進(jìn)行托管身份驗(yàn)證,授權(quán)和多因素身份驗(yàn)證。

如果您要處理大量流數(shù)據(jù),反應(yīng)式應(yīng)用程序可讓您更好地?cái)U(kuò)展。 它們是非阻塞的,并且往往效率更高,因?yàn)樗鼈冊(cè)诘却l(fā)生事情時(shí)不會(huì)占用處理能力。

反應(yīng)系統(tǒng)包含異步I / O。 異步I / O背后的概念很簡(jiǎn)單:通過回收本來會(huì)在等待I / O活動(dòng)時(shí)處于空閑狀態(tài)的資源來緩解資源利用效率低下的問題。 異步I / O顛倒了I / O處理的常規(guī)設(shè)計(jì):向客戶端通知新數(shù)據(jù)而不是請(qǐng)求新數(shù)據(jù); 這使客戶可以在等待時(shí)做其他事情。

如果要構(gòu)建反應(yīng)式應(yīng)用程序,則需要它一直到整個(gè)數(shù)據(jù)庫都是反應(yīng)式的。 將阻塞的JDBC驅(qū)動(dòng)程序與Spring WebFlux一起使用,您會(huì)對(duì)其性能感到失望。 使用反應(yīng)性NoSQL數(shù)據(jù)庫(例如Cassandra,MongoDB,Couchbase和Redis),其性能將給您留下深刻的印象。

在本教程中,您將學(xué)習(xí)如何使用Spring Boot,Spring WebFlux和Spring Data創(chuàng)建與NoSQL數(shù)據(jù)庫后端(在本例中為MongoDB)通信的反應(yīng)式Web服務(wù)。

我只是對(duì)你說了幾句。 讓我們?cè)竭^它們。

如果您已經(jīng)了解NoSQL和Reactive編程,并且只想看一些代碼,請(qǐng)隨時(shí)跳過前兩部分,并從“構(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ù)存儲(chǔ)在具有強(qiáng)類型且表列之間關(guān)系明確的表中。 關(guān)系數(shù)據(jù)庫的緊密,定義明確的結(jié)構(gòu)既是優(yōu)點(diǎn)也是缺點(diǎn)。 這是一個(gè)權(quán)衡。 NoSQL數(shù)據(jù)庫使該模型爆炸式增長(zhǎng),并提供了其他模型,這些模型可提供更大的靈活性并易于擴(kuò)展。

擴(kuò)展的微服務(wù)/集群模型為關(guān)系數(shù)據(jù)庫帶來了很多問題。 它們不是為在多臺(tái)計(jì)算機(jī)上運(yùn)行和保持同步而設(shè)計(jì)的。 開發(fā)NoSQL數(shù)據(jù)庫部分是為了解決此問題。 通常,它們是在考慮群集和水平縮放的情況下構(gòu)建的。 為了以另一種方式展示這種方式(通常是使用SQL數(shù)據(jù)庫),如果需要更多功能,則必須調(diào)整數(shù)據(jù)庫運(yùn)行所在的服務(wù)器的大小。 它幾乎是單片的,并且即使當(dāng)今有現(xiàn)代的虛擬服務(wù)器功能,也很難動(dòng)態(tài)地做到這一點(diǎn)。 在Internet規(guī)模上,更好的模型是擁有一個(gè)靈活的數(shù)據(jù)庫集群,它們可以在數(shù)據(jù)庫之間自動(dòng)同步,并允許您根據(jù)需求增加實(shí)例(并在需求減少時(shí)減少實(shí)例)。 這意味著增加功率并不需要更昂貴的機(jī)器。 您可以根據(jù)需要簡(jiǎn)單地添加更多,相對(duì)便宜的計(jì)算機(jī)。

NoSQL數(shù)據(jù)庫的另一個(gè)潛在好處是它們的靈活性。 像MongoDB這樣的基于文檔的NoSQL數(shù)據(jù)庫可以在文檔中存儲(chǔ)任意數(shù)據(jù)。 可以將字段動(dòng)態(tài)添加到存儲(chǔ)的文檔中,而無需增加表遷移的開銷。 當(dāng)然,這并不能解決版本控制的問題,仍然取決于應(yīng)用程序來處理不斷變化的數(shù)據(jù)結(jié)構(gòu)(并不總是瑣碎的),但是至少您并沒有與數(shù)據(jù)庫打架。

綜上所述,請(qǐng)記住,SQL /關(guān)系數(shù)據(jù)庫不會(huì)走到任何地方。 它們經(jīng)過驗(yàn)證,快速且超級(jí)可靠。 在某些情況下,它們更便宜,更容易。 例如,對(duì)于簡(jiǎn)單的網(wǎng)站或博客,MySQL很難被擊敗。 但是即使在企業(yè)環(huán)境中, 有時(shí)您也想要關(guān)系數(shù)據(jù)庫強(qiáng)制執(zhí)行的結(jié)構(gòu)。 如果您有一個(gè)相當(dāng)靜態(tài)的數(shù)據(jù)模型并且不需要擴(kuò)展到Internet規(guī)模,則SQL可能是最佳選擇。 這些類型的設(shè)計(jì)注意事項(xiàng)在您深入數(shù)據(jù)庫選擇之前值得深思,因?yàn)樗切碌那腋∪A的。

我在本教程中使用的是MongoDB,因?yàn)橐婚_始它很容易。 如果您使用Spring Data MongoDB,它甚至更容易!

積極反應(yīng)!

反應(yīng)性是另一種行話。 感覺就像人們喜歡在聚會(huì)和會(huì)議上隨意表達(dá)的那種字眼,只是含糊其詞。 就像“存在的”或“ ennui”。 讓我們定義它。

如果您看一下Spring WebFlux文檔 ,他們會(huì)很好地概述什么是反應(yīng)性

術(shù)語“反應(yīng)性”是指圍繞響應(yīng)變化而構(gòu)建的編程模型-網(wǎng)絡(luò)組件響應(yīng)I / O事件,UI控制器響應(yīng)鼠標(biāo)事件等。 從這個(gè)意義上說,非阻塞是反應(yīng)性的,因?yàn)殡S著操作完成或數(shù)據(jù)可用,我們現(xiàn)在處于響應(yīng)通知的模式,而不是被阻塞。

因此,反應(yīng)式意味著:非阻塞,異步且以流處理為中心。

構(gòu)建一個(gè)Spring Boot資源服務(wù)器

從GitHub倉庫克隆啟動(dòng)項(xiàng)目,并檢出start分支:

git clone -b start https://github.com/oktadeveloper/okta-spring-boot-mongo-webflux-example.git

入門項(xiàng)目是一個(gè)簡(jiǎn)單的Spring Boot入門項(xiàng)目,在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')

第一個(gè)是針對(duì)Spring WebFlux(Spring MVC的響應(yīng)版本)。 第二個(gè)引入了Spring需要的反應(yīng)性MongoDB依賴關(guān)系。 第三個(gè)是名為L(zhǎng)ombok的項(xiàng)目,該項(xiàng)目使我們免于在Java代碼中鍵入一堆構(gòu)造函數(shù),getter和setter(您可以在其網(wǎng)頁上查看該項(xiàng)目)。 最后一個(gè)依賴項(xiàng)是嵌入式的內(nèi)存MongoDB數(shù)據(jù)庫。 這個(gè)數(shù)據(jù)庫非常適合測(cè)試,像這樣的簡(jiǎn)單教程,并且不持久。

可以使用簡(jiǎn)單的Gradle命令運(yùn)行該應(yīng)用程序:

./gradlew bootRun

當(dāng)然,如果您此時(shí)運(yùn)行該應(yīng)用程序,則不會(huì)做太多事情。 Spring Boot將加載,但是還沒有定義任何控制器,資源或存儲(chǔ)庫,因此沒有太多事情發(fā)生。

為MongoDB定義模型類

為了清楚起見,本教程將與我之前提到的本系列的第一部分并行。 您將要構(gòu)建一個(gè)存儲(chǔ)皮劃艇類型的簡(jiǎn)單服務(wù)器。 我總是建議首先定義數(shù)據(jù)結(jié)構(gòu)來開始任何項(xiàng)目。

在com.okta.springbootmongo包中創(chuàng)建一個(gè)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)建文檔而不是表?xiàng)l目。 其他三個(gè)注釋是Lombok幫助器,它們自動(dòng)生成getter,setter和構(gòu)造函數(shù)。

皮劃艇文檔具有五個(gè)屬性:名稱,所有者,值和類型。 這些會(huì)自動(dòng)映射到MongoDB的適當(dāng)BSON類型。 什么是BSON類型? 看看有關(guān)該主題的MongoDB文檔 。 它們是用于將數(shù)據(jù)保留在MongoDB文檔中的二進(jìn)制序列化類型。 它們定義了可以存儲(chǔ)在MongoDB數(shù)據(jù)庫中的原始類型。

將ReactiveMongoRepository添加到您的Spring Boot應(yīng)用程序

使用@Document批注定義Kayak類可以使Spring Boot知道數(shù)據(jù)的結(jié)構(gòu),但實(shí)際上并沒有提供任何從數(shù)據(jù)庫保存或加載數(shù)據(jù)的方法。 為此,您需要定義一個(gè)存儲(chǔ)庫。

這樣做的代碼非常簡(jiǎn)單。 在com.okta.springbootmongo包中創(chuàng)建一個(gè)KayakRepository.java類文件:

package com.okta.springbootmongo; import org.springframework.data.mongodb.repository.ReactiveMongoRepository; public interface KayakRepository extends ReactiveMongoRepository<Kayak, Long> { }

實(shí)際上,這為您提供了從數(shù)據(jù)庫創(chuàng)建,更新,讀取和刪除文檔所需的所有基本方法。 要了解操作方法,請(qǐng)深入研究ReactiveMongoRepository類和其他各種超類,尤其是ReactiveCrudRepository 。 查看ReactiveCrudRepository 的文檔以查看已實(shí)現(xiàn)的方法。

ReactiveCrudRepository實(shí)際上提供了一組基本而完整的CRUD方法。 ReactiveMongoRepository在此基礎(chǔ)上構(gòu)建,以提供一些特定于MongoDB的查詢功能。

使用Spring WebFlux實(shí)現(xiàn)控制器

添加存儲(chǔ)庫后,您有足夠的能力以編程方式處理數(shù)據(jù)。 但是,沒有定義Web端點(diǎn)。 在前面的教程中,添加REST端點(diǎn),這是需要的所有是對(duì)加@RepositoryRestResource注釋到KayakRepository類。 這通過所有CRUD方法為我們自動(dòng)生成了功能齊全的REST資源。 但是,此快捷方式不適用于Spring WebFlux。 必須明確定義任何公共Web終結(jié)點(diǎn)。

添加以下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(); } }

該控制器添加了兩個(gè)端點(diǎn):

  • POST /kayaks增加了新的皮劃艇
  • GET /kayaks列出所有皮劃艇

您還將注意到,該類使用Spring依賴項(xiàng)注入將KayakRepository實(shí)例自動(dòng)KayakRepository到控制器中,并且您將看到如何使用存儲(chǔ)庫持久化Kayak域類。

此類看起來非常像關(guān)系的,阻止的版本。 許多幕后工作使這種情況成為現(xiàn)實(shí)。 不用擔(dān)心,但是,這是100%無反應(yīng)的非阻塞代碼。

測(cè)試您的Spring Boot服務(wù)器

至此,您已經(jīng)可以完全運(yùn)行皮劃艇REST資源服務(wù)器。 在測(cè)試之前,請(qǐng)將以下方法添加到MainApplication類。 只需在應(yīng)用程序加載時(shí)將一些測(cè)試數(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是一個(gè)很棒的命令行實(shí)用工具,它使對(duì)資源服務(wù)器的請(qǐng)求運(yùn)行變得容易。 如果未安裝HTTPie,請(qǐng)使用brew install httpie進(jìn)行brew install httpie 。 或前往他們的網(wǎng)站并實(shí)現(xiàn)它。 或者只是跟隨。

確保您的Spring Boot應(yīng)用正在運(yùn)行。 如果不是,請(qǐng)使用./gradlew bootRun啟動(dòng)它。

針對(duì)您的資源服務(wù)器運(yùn)行GET請(qǐng)求: http :8080/kayaks ,這是http GET http://localhost:8080/kayaks簡(jiǎn)寫。

您會(huì)得到:

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請(qǐng)求http :8080/kayaks ,您將在列表中看到新的皮劃艇!

設(shè)置安全認(rèn)證

現(xiàn)在,您需要集成Okta for OAuth 2.0并將基于令牌的身份驗(yàn)證添加到資源服務(wù)器。 本部分與本教程第1部分中的部分完全相同,因此,如果您已完成此操作,則只需要您的客戶ID,就可以跳至下一部分。

如果尚未注冊(cè),請(qǐng)?jiān)L問developer.okta.com并注冊(cè)一個(gè)免費(fèi)帳戶。 擁有帳戶后,通過單擊“ 應(yīng)用程序”頂部菜單項(xià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 。 您將在稍后使用它來檢索測(cè)試令牌。

注意 :如果要實(shí)現(xiàn)像Angular或React這樣的前端,則可能需要根據(jù)所使用的平臺(tái)來更新默認(rèn)的登錄重定向URI。 由于本教程僅創(chuàng)建沒有前端的資源服務(wù)器,因此暫時(shí)不重要。 我們所有的資源服務(wù)器將要做的就是使用授權(quán)服務(wù)器驗(yàn)證JSON Web令牌,而無需重定向。

另外,請(qǐng)注意您的客戶ID ,稍后您將需要它。

配置您的Spring Boot服務(wù)器以進(jìn)行令牌認(rèn)證

現(xiàn)在,您需要更新一些項(xiàng)目文件以為OAuth 2.0配置Spring Boot。

將以下依賴項(xiàng)添加到您的build.gradle文件中:

dependencies {...compile('com.okta.spring:okta-spring-boot-starter:1.1.0')... }

創(chuàng)建一個(gè)名為src/main/resources/application.yml的新配置文件

okta:oauth2:issuer: https://{yourOktaDomain}/oauth2/defaultgroupsClaim: groupsclientId: {yourClientId}

在com.okta.springbootmongo包中創(chuàng)建一個(gè)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();} }

測(cè)試您的受保護(hù)服務(wù)器

停止您的Spring Boot服務(wù)器并使用以下./gradlew bootRun重新啟動(dòng)它: ./gradlew bootRun

從命令行運(yùn)行一個(gè)簡(jiǎn)單的GET請(qǐng)求。

http :8080/kayaks

您會(huì)得到未經(jīng)授權(quán)的401 /。

HTTP/1.1 401 Unauthorized Cache-Control: no-store Content-Type: application/json;charset=UTF-8

生成訪問令牌

要立即訪問服務(wù)器,您需要一個(gè)有效的訪問令牌。 您可以使用OpenID Connect調(diào)試器來幫助您完成此任務(wù)。 在另一個(gè)窗口中,打開oidcdebugger.com 。

  • 授權(quán)URIhttps://{yourOktaDomain} /oauth2/default/v1/authorize
  • 重定向URI :不變。 這是您在上面的OIDC應(yīng)用程序中添加的值。
  • 客戶ID :來自您剛創(chuàng)建的OIDC應(yīng)用程序。
  • 范圍 : openid profile email 。
  • 狀態(tài) :您要通過OAuth重定向過程傳遞的任何值。 我將其設(shè)置為{} 。
  • Nonce :可以一個(gè)人呆著。 Nonce表示“編號(hào)已使用一次”,是一種簡(jiǎn)單的安全措施,用于防止同一請(qǐng)求被多次使用。
  • 響應(yīng)類型 : token 。
  • 響應(yīng)方式 : form_post 。

點(diǎn)擊發(fā)送請(qǐng)求 。 如果您尚未登錄developer.okta.com,則需要登錄。如果(可能的話)已經(jīng)登錄,則將為您的登錄身份生成令牌。

使用您的訪問令牌

您可以通過在Bearer類型的Authorization請(qǐng)求標(biāo)頭中包含令牌來使用令牌。

將令牌存儲(chǔ)在shell變量中:

TOKEN=eyJraWQiOiJldjFpay1DS3UzYjJXS3QzSVl1MlJZc3VJSzBBYUl3NkU4SDJfNVJr...

然后使用HTTPie發(fā)出GET請(qǐng)求:

http :8080/kayaks "Authorization: Bearer $TOKEN"

請(qǐng)注意上面的雙引號(hào)。 單引號(hào)不起作用,因?yàn)閟hell變量未擴(kuò)展。

添加基于組的授權(quán)

現(xiàn)在,您將通過添加基于組成員身份來控制對(duì)特定控制器端點(diǎn)的訪問的功能,來使授權(quán)方案更加完善。

要在Okta中使用基于組的授權(quán),您需要在訪問令牌中添加一個(gè)“組”聲明。 創(chuàng)建一個(gè)Admin組(“ 用戶” >“ 組” >“ 添加組” )并將您的用戶添加到其中。 您可以使用注冊(cè)時(shí)使用的帳戶,也可以創(chuàng)建一個(gè)新用戶(“ 用戶” >“ 添加人” )。 導(dǎo)航到“ API” >“ 授權(quán)服務(wù)器” ,單擊“ 授權(quán)服務(wù)器”選項(xiàng)卡,然后編輯默認(rèn)選項(xiàng)卡。 點(diǎ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();} }

用簡(jiǎn)單的英語來說,這告訴Spring Boot要求對(duì)/kayak端點(diǎn)的任何POST都具有組成員身份Admin ,對(duì)于所有其他請(qǐng)求,僅需要有效的JWT。

您的基于組的授權(quán)策略由以下兩行定義:

.pathMatchers(HttpMethod.POST, "/kayaks/**").hasAuthority("Admin") .anyExchange().authenticated()

有關(guān)更多信息,請(qǐng)參閱ServerHttpSecurity類的文檔 。

您可能想知道為什么它說hasAuthority()而不是hasRole()或hasGroup() 。 這是因?yàn)?strong>授權(quán)是Spring調(diào)用服務(wù)器發(fā)送的文本字符串以表示權(quán)限成員身份的方式,無論是角色還是組。 hasRole()假定角色采用特定格式:“ ROLE_ADMIN”。 可以重寫此方法,但是hasAuthority()是直接使用授權(quán)字符串的簡(jiǎn)單方法。 沒有hasGroup()方法,因?yàn)榍皟蓚€(gè)示例(如果未明確說明)涵蓋了該用例。

創(chuàng)建一個(gè)非管理員用戶

要測(cè)試基于組的授權(quán)方案,您需要一個(gè)不是管理員的用戶。 轉(zhuǎn)到developer.okta.com儀表板。

從頂部菜單中,選擇“ 用戶” >“ 人員” 。 單擊添加人按鈕。

給用戶一個(gè)名字姓氏用戶名 (也將是主要電子郵件 )。 值無關(guān)緊要,并且您將不必檢查電子郵件。 您只需要知道電子郵件地址/用戶名和密碼,即可在一分鐘內(nèi)登錄Okta。

密碼 :將下拉菜單更改為“ 由管理員設(shè)置”

為用戶分配密碼。

點(diǎn)擊保存

您剛剛創(chuàng)建的用戶不是Admin組的成員,而是默認(rèn)組Everyone的成員。

基于測(cè)試組的授權(quán)

注銷您的Okta開發(fā)人員儀表板。

返回OIDC調(diào)試器并生成一個(gè)新令牌。

這次,以新的非管理員用戶身份登錄。 系統(tǒng)會(huì)要求您選擇一個(gè)安全問題,然后將您重定向到https://oidcdebugger.com/debug頁面,您可以在其中復(fù)制令牌。

如果愿意,可以轉(zhuǎn)到j(luò)sonwebtoken.io并解碼新令牌。 在有效內(nèi)容中, 子聲明將顯示用戶的電子郵件/用戶名,而組聲明將僅顯示“ 所有人”組。

{"sub": "test@gmail.com","groups": ["Everyone"] }

根據(jù)許可方案,該用戶應(yīng)該能夠列出所有皮劃艇,但不能添加新的皮劃艇。

請(qǐng)記住,將令牌存儲(chǔ)在shell腳本中,如下所示:

TOKEN=eyJraWQiOiI4UlE5REJGVUJOTnJER0VGaEExekd6bWJqREpSYTRTT1lhaGpsM3d4...

發(fā)出GET請(qǐng)求以列出所有皮劃艇:

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生成一個(gè)新令牌。 這次使用您原來的管理員帳戶重新登錄。

將新令牌存儲(chǔ)在shell變量TOKEN 。

運(yùn)行POST請(qǐng)求:

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 }

一切順利,已通過身份驗(yàn)證

而已! 在本教程中,您使用Spring WebFlux創(chuàng)建了一個(gè)Spring Boot應(yīng)用程序,使用嵌入式MongoDB數(shù)據(jù)庫來持久化模型類,并向其中添加了資源服務(wù)器。 之后,我向您展示了如何使用Okta和OAuth 2.0添加JWT令牌身份驗(yàn)證。 最后,您了解了如何使用Okta和Spring Security將基于組的授權(quán)添加到控制器中的特定端點(diǎn)。

如果您想查看這個(gè)完整的項(xiàng)目,可以在oktadeveloper / okta-spring-boot-mongo-webflux-example上的GitHub上找到該倉庫 。

如果還沒有,請(qǐng)查看本系列的第1部分: 使用PostgreSQL使用Spring Boot和JPA構(gòu)建基本應(yīng)用程序 。 它是同一個(gè)應(yīng)用程序,但是使用了更傳統(tǒng)的關(guān)系數(shù)據(jù)庫和Spring MVC樣式的阻止Web服務(wù)器。

了解有關(guān)Spring Boot,MongoDB和安全用戶管理的更多信息

如果您想了解有關(guān)Spring Boot,Spring Security或Okta的更多信息,請(qǐng)查看以下任何出色的教程:

  • 使用Spring WebFlux構(gòu)建反應(yīng)性API
  • Spring Boot,OAuth 2.0和Okta入門
  • 15分鐘內(nèi)將單一登錄添加到您的Spring Boot Web App
  • 使用多重身份驗(yàn)證保護(hù)您的Spring Boot應(yīng)用程序安全
  • 使用Spring Boot和GraphQL構(gòu)建安全的API

以下是一些來自Spring的優(yōu)秀資源:

  • 對(duì)Spring Data做出反應(yīng)
  • OAuth2 WebFlux文檔
  • 構(gòu)建反應(yīng)式RESTful Web服務(wù)
  • Spring WebFlux文檔

如果您喜歡這篇文章,您可能會(huì)喜歡我們發(fā)布的其他文章。 在Twitter上關(guān)注@oktadev ,并訂閱我們的YouTube頻道以獲取更多有趣的教程。

“使用Spring Boot和MongoDB構(gòu)建反應(yīng)性應(yīng)用程序”最初于2019年2月21日發(fā)布在Okta開發(fā)人員博客上。

“我喜歡編寫身份驗(yàn)證和授權(quán)代碼。” ?從來沒有Java開發(fā)人員。 厭倦了一次又一次地建立相同的登錄屏幕? 嘗試使用Okta API進(jìn)行托管身份驗(yàn)證,授權(quán)和多因素身份驗(yàn)證。

翻譯自: https://www.javacodegeeks.com/2019/03/build-reactive-app-spring-boot-mongodb.html

總結(jié)

以上是生活随笔為你收集整理的使用Spring Boot和MongoDB构建一个反应式应用程序的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。