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

歡迎訪問 生活随笔!

生活随笔

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

javascript

在15分钟内使用Spring Boot和Spring Security构建一个Web应用程序

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

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

開發(fā)人員知道保護(hù)Web應(yīng)用程序安全可能會(huì)很麻煩。 正確地做是很難的。 最糟糕的是,“正確”是一個(gè)移動(dòng)的目標(biāo)。 安全協(xié)議會(huì)更改。 在依賴項(xiàng)中發(fā)現(xiàn)漏洞,并發(fā)布了補(bǔ)丁程序。 必須生成大量通常很復(fù)雜的樣板代碼。 在過去的十年中,軟件即服務(wù)的范式已經(jīng)泛濫成災(zāi),盡管我喜歡和下一個(gè)開發(fā)人員一樣重新發(fā)明輪子(因?yàn)轱@然,我會(huì)比他們雇用的yahoo更好地編寫它),但是安全是一個(gè)領(lǐng)域在這里,我很樂意將這項(xiàng)工作分擔(dān)給專家。 輸入Okta。

在本教程中,您將使用Spring Boot來構(gòu)建帶有用戶注冊系統(tǒng)和登錄系統(tǒng)的簡單Web應(yīng)用程序。 它具有以下功能:

  • 登錄和注冊頁面
  • 密碼重置工作流程
  • 根據(jù)組成員身份限制訪問

下載Spring Boot Web App示例項(xiàng)目

您首先需要的是免費(fèi)的Okta帳戶。 如果您還沒有,請前往developer.okta.com并注冊!

下一步是從GitHub下載本教程的示例項(xiàng)目。

git clone https://github.com/oktadeveloper/okta-spring-simple-app-example.git spring-app

該項(xiàng)目使用Gradle作為構(gòu)建工具以及Thymeleaf模板系統(tǒng)。

運(yùn)行初始Web應(yīng)用

從GitHub存儲(chǔ)庫下載示例代碼后,使用以下git命令git checkout tags/Start Start標(biāo)記: git checkout tags/Start 。

目前,該應(yīng)用程序尚未受到任何保護(hù)。 沒有啟用任何授權(quán)或身份驗(yàn)證(即使build.gradle文件中包含必需的依賴build.gradle )。 繼續(xù)并運(yùn)行示例,方法是打開一個(gè)終端,然后從項(xiàng)目根目錄運(yùn)行命令./gradlew bootRun ( bootRun命令是Gradle Spring Boot插件提供的任務(wù),已添加到build.gradle中的build.gradle文件中。部分)。

在您喜歡的瀏覽器中導(dǎo)航到http://localhost:8080 ,您應(yīng)該看到以下內(nèi)容:

如果您點(diǎn)擊“受限”按鈕:

為您的Spring Boot + Spring Security Web App添加項(xiàng)目依賴項(xiàng)

項(xiàng)目依賴關(guān)系在build.gradle文件中定義(請參見下文)。 這個(gè)文件中有很多事情要做,本教程不會(huì)嘗試向您解釋Gradle構(gòu)建系統(tǒng)。 隨時(shí)檢查他們的文檔 。 我只想指出幾件事。

首先,請注意,我們包括了okta-spring-boot-starter 。 該項(xiàng)目大大簡化了Okta與Spring Boot應(yīng)用程序的集成。 如果沒有此啟動(dòng)程序,完全可以使用Okta和Spring Boot。 實(shí)際上,直到引入“組”和“角色”為止,兩者之間的差異很小(主要涉及application.yml更改)。 但是,一旦開始嘗試集成組和角色,Okta Spring Boot Starter會(huì)節(jié)省大量代碼。 如果您想更深入一點(diǎn),請看一下Okta Spring Boot Starter GitHub項(xiàng)目 。

其余的依賴關(guān)系涉及Spring和Spring Boot。 您會(huì)注意到org.springframework.boot依賴項(xiàng)都沒有版本號(hào)。 這是因?yàn)镾pring io.spring.dependency-management Gradle插件完成了一些幕后魔術(shù)。 Spring Boot版本由build.gradle文件頂部附近的構(gòu)建腳本屬性springBootVersion設(shè)置。 基于此版本號(hào),Spring依賴性管理插件決定要包括的依賴性版本。

我們還引入了org.springframework.boot Gradle插件,該插件添加了我們將用于運(yùn)行應(yīng)用程序的bootRun任務(wù)。

  • spring-boot-starter-security和spring-boot-starter-web是Spring Boot的核心依賴項(xiàng)。
  • 必須使用spring-security-oauth2-autoconfigure才能使用@EnableOAuth2Sso批注,該批注用于將OAuth和Single Sign-On掛接到我們的應(yīng)用程序中。
  • spring-boot-starter-thymeleaf和thymeleaf-extras-springsecurity4引入了Thymeleaf模板系統(tǒng),并將其與Spring Security集成。
buildscript { ext { springBootVersion = '2.0.5.RELEASE' } repositories { mavenCentral() } dependencies { classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}") } } apply plugin: 'java' apply plugin: 'eclipse' apply plugin: 'org.springframework.boot' apply plugin: 'io.spring.dependency-management' group = 'com.okta.springboot' version = '0.0.1-SNAPSHOT' sourceCompatibility = 1.8 repositories { mavenCentral() } dependencies { compile('com.okta.spring:okta-spring-boot-starter:0.6.0') compile('org.springframework.boot:spring-boot-starter-security') compile('org.springframework.boot:spring-boot-starter-web') compile('org.springframework.boot:spring-boot-starter-thymeleaf') compile('org.thymeleaf.extras:thymeleaf-extras-springsecurity4') compile('org.springframework.security.oauth.boot:spring-security-oauth2-autoconfigure:2.0.5.RELEASE') testCompile('org.springframework.boot:spring-boot-starter-test') "testCompile('org.springframework.security:spring-security-test') } /* This is required to resolve a logging dependency conflict between the okta-spring-boot-starter and the various spring dependencies. */ configurations.all { exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging' exclude group: 'org.springframework.boot', module: 'logback-classic' }

了解您的Spring Boot應(yīng)用程序

Java Web應(yīng)用程序只有三個(gè)類文件和幾個(gè)模板。 顯然,Spring Boot在后臺(tái)進(jìn)行了大量繁重的工作,但是我們的類文件中發(fā)生了什么?

應(yīng)用程序入口點(diǎn)在SpringSimpleApplication類中:

@SpringBootApplication public class SpringSimpleApplication { public static void main(String[] args) { SpringApplication.run(SpringSimpleApplication.class, args); } }

這里發(fā)生了兩個(gè)重要的事情,這些事情使事情發(fā)生了變化:1)我們使用@SpringBootApplication批注,以及2)我們的main方法調(diào)用SpringApplication.run()方法。 這是整個(gè)Spring / Spring Boot系統(tǒng)的入口。

SpringSecurityWebAppConfig類是一種使用Java代碼配置Spring Boot處理Web應(yīng)用程序安全性的方式。 在這里,我們使用HttpSecurity對象從所有端點(diǎn)中刪除授權(quán)。 默認(rèn)情況下,Spring Boot的行為是相反的:所有端點(diǎn)都需要授權(quán)。

@Configuration public class SpringSecurityWebAppConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().anyRequest().permitAll(); } }

@Configuration注釋告訴Spring我們正在使用該類作為編程配置的源,從而允許我們重寫configure()方法。

最后一個(gè)Java類SimpleAppController是我們唯一的控制器對象。 Spring Boot Web應(yīng)用程序中的控制器是URL請求映射到Java代碼的地方。 @Controller注釋告訴Spring此類是一個(gè)控制器。

@Controller class SimpleAppController { @RequestMapping("/") String home() { return "home"; } @RequestMapping("/restricted") String restricted() { return "restricted"; } }

使用@RequestMapping批注在類方法和URL之間建立連接。

我們有兩個(gè)映射:

  • “家庭”映射
  • “受限”映射
  • 請記住,一開始實(shí)際上沒有任何“限制”,所以不要為此感到困惑。 您將鎖定該映射一點(diǎn)。

    還要注意,這些類返回一個(gè)簡單的文本字符串,但這會(huì)自動(dòng)變成完整的html文件。 這是build.gradle文件中包含的Thymeleaf依賴項(xiàng)的一部分。 這些字符串被假定為模板文件名,默認(rèn)情況下是類路徑上templates目錄中的路徑。

    因此,“ home”被映射到src/main/resources/templates/home.html模板文件。 當(dāng)將Web應(yīng)用程序打包到最終的jar中時(shí),會(huì)將整個(gè)資源文件夾復(fù)制到類路徑中,以便可以在運(yùn)行時(shí)訪問templates目錄。

    為OAuth 2.0單一登錄設(shè)置Okta

    現(xiàn)在,您將為我們的應(yīng)用設(shè)置授權(quán)。 Okta使這個(gè)超級(jí)容易。 您應(yīng)該已經(jīng)注冊了一個(gè)免費(fèi)的developer.okta.com帳戶。 現(xiàn)在,您將創(chuàng)建一個(gè)OpenID Connect(OIDC)應(yīng)用程序,以與OAuth 2.0單一登錄(SSO)一起使用。

    如果您還不熟悉它們的話,可能會(huì)有很多術(shù)語和縮寫。 很簡單, OAuth 2.0是授權(quán)的行業(yè)標(biāo)準(zhǔn)-一種標(biāo)準(zhǔn)化且經(jīng)過測試的方法,授權(quán)服務(wù)器和應(yīng)用程序可以通過該方法進(jìn)行通信以促進(jìn)用戶授權(quán)。 OpenID Connect是OAuth 2.0之上的一層,用于標(biāo)準(zhǔn)化和簡化授權(quán)過程以及提供用戶驗(yàn)證。 它們一起為應(yīng)用程序與提供身份驗(yàn)證和授權(quán)服務(wù)的遠(yuǎn)程服務(wù)器(例如Okta)進(jìn)行交互提供了一種行之有效的方法。

    要?jiǎng)?chuàng)建OIDC應(yīng)用,請打開Okta開發(fā)人員信息中心。 單擊“ 應(yīng)用程序”頂部菜單項(xiàng),然后單擊“ 添加應(yīng)用程序”

    您應(yīng)該看到以下屏幕。 單擊“ Web”選項(xiàng)的圖標(biāo)。 單擊下一步

    您需要更新一些初始配置選項(xiàng)。 首先將名稱更改為更具描述性的名稱。 我使用了“ Okta Spring Boot簡單Web應(yīng)用程序”。 接下來,將登錄重定向URI更新為http://localhost:8080/login 。 單擊完成

    這將帶您進(jìn)入新應(yīng)用程序的常規(guī)配置選項(xiàng)卡。 向下滾動(dòng)并記下客戶端ID和客戶端密碼。 稍后您將需要這些。

    這就是為Okat設(shè)置Okta所需要做的一切! 現(xiàn)在,讓我們返回Spring Boot應(yīng)用程序,并將新的OIDC應(yīng)用程序掛接到Spring Boot應(yīng)用程序中。

    為單點(diǎn)登錄(SSO)配置Spring Boot應(yīng)用

    現(xiàn)在,您需要配置Spring Boot應(yīng)用程序以與Okta服務(wù)器進(jìn)行交互。 這非常容易。 我們需要做兩件事:

  • 添加@EnableOAuth2Sso批注
  • 更新application.yml配置
  • 首先將@EnableOAuth2Sso批注添加到SpringSecurityWebAppConfig類。

    @EnableOAuth2Sso @Configuration public class WebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests().anyRequest().permitAll(); } }

    @EnableOAuth2Sso批注會(huì)做很多事情。 值得深入了解正在發(fā)生的事情。 您可以查看有關(guān)注解本身的Spring文檔 ,以及它們的Spring Boot和OAuth2教程 。

    我想指出的一件事(公元前這使我煩惱了一陣子,而我只是想出了這一點(diǎn))是,您可以將此注釋放在項(xiàng)目中的其他類上。 但是,如果這樣做,請注意Spring將創(chuàng)建一個(gè)WebSecurityConfigurerAdapter并將其添加到安全鏈中。 由于我們還將創(chuàng)建一個(gè)WebSecurityConfigurerAdapter,因此將有兩個(gè),并且您將收到有關(guān)鏈訂單沖突的錯(cuò)誤。 這是因?yàn)閮蓚€(gè)WebSecurityConfigurerAdapters在默認(rèn)情況下將使用相同的鏈順序。 您可以通過在自定義類中添加@Order(101)批注來解決此錯(cuò)誤。 但是,更好的方法是將@EnableOAuth2Sso批注添加到我們的WebSecurityConfigurerAdapter類WebSecurityConfigurerAdapter ,Spring將使用該類而不是創(chuàng)建重復(fù)的類。

    您需要進(jìn)行的第二個(gè)更改是更新src/main/resources/application.yml文件,為來自O(shè)kta OIDC應(yīng)用程序的OAuth SSO值填寫一些Okta特定的配置選項(xiàng)。

    您需要從上面創(chuàng)建的應(yīng)用程序中填寫您的客戶ID和客戶機(jī)密。 您還需要更改發(fā)行者URL,以使其反映您的Okta預(yù)覽URL,例如dev-123456.oktapreview.com 。

    server: port: 8080 spring: resources: static-locations: "classpath:/static/" okta: oauth2: issuer: https://{yourOktaDomain}/oauth2/default clientId: {yourClientId} clientSecret: {yourClientSecret}rolesClaim: groups

    完善我們的權(quán)限

    現(xiàn)在,您將要更新SpringSecurityWebAppConfig類,以便擁有一個(gè)公共主頁和一個(gè)受限制的“受限制”頁面。 我們通過對HttpSecurity對象使用Spring的流暢API來實(shí)現(xiàn)此目的。

    import org.springframework.boot.autoconfigure.security.oauth2.client.EnableOAuth2Sso; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;@EnableOAuth2Sso @Configuration public class SpringSecurityWebAppConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/").permitAll() // allow all at home page.antMatchers("/img/**").permitAll() // allow all to access static images.anyRequest().authenticated(); // authenticate everything else!} }

    重新啟動(dòng)您的應(yīng)用程序,現(xiàn)在您應(yīng)該能夠:

  • 無需認(rèn)證即可查看主頁
  • 未經(jīng)身份驗(yàn)證就無法看到/restricted頁面
  • 能夠使用Okta單一登錄進(jìn)行身份驗(yàn)證
  • 本教程中的這一點(diǎn)與GitHub存儲(chǔ)庫中的OktaOAuthSSO標(biāo)簽相對應(yīng)。

    看看Thymeleaf模板

    總體而言,Thymeleaf模板是很容易解釋的,但是我確實(shí)想指出幾件事。 Thymeleaf模板是完全有效HTML5,這很好。 如果您想深入了解,可以訪問他們的網(wǎng)站和他們的文檔 。

    我想指出的是模板如何引入身份驗(yàn)證信息。 為此,我們使用了thymeleaf-extras-springsecurity插件。 這是包含在build.gradle文件中的以下行:

    compile ("org.thymeleaf.extras:thymeleaf-extras-springsecurity4")

    并且作為主<html>標(biāo)記上的XML名稱空間屬性包含在模板文件中。

    xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity4"

    這個(gè)插件使我們可以檢查是否使用帶有自定義SPEL表達(dá)式(Spring表達(dá)式語言)的th:if屬性對用戶進(jìn)行了身份驗(yàn)證。 它還允許我們插入身份驗(yàn)證屬性。 在下面,您將看到一個(gè)跨度<span th:text="${#authentication.name}"></span> ,該<span th:text="${#authentication.name}"></span>用于插入已驗(yàn)證用戶的名稱。

    <html xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity4"> <head> <!--/*/ <th:block th:include="fragments/head :: head"/> /*/--> </head> <body> <div class="container-fluid"> <div class="row"> <div class="box col-md-6 col-md-offset-3"> <div class="okta-header"> <img src="img/logo.png"/> </div> <!--/* displayed if account IS NOT null, indicating that the user IS logged in */--> <div th:if="${#authorization.expression('isAuthenticated()')}"> <h1 th:inline="text">Hello, <span th:text="${#authentication.name}"></span>!</h1> <a href="/restricted" class="btn btn-primary">Restricted</a> </div> <!--/* displayed if account IS null, indicating that the user IS NOT logged in */--> <div th:unless="${#authorization.expression('isAuthenticated()')}"> <h1>Who are you?</h1> <a href="/restricted" class="btn btn-primary">Restricted</a> </div> </div> </div> </div> </body> </html>

    thymeleaf-extras-springsecurity插件還具有其他一些不錯(cuò)的功能。 如果您想更深入一點(diǎn),請查看GitHub上的項(xiàng)目存儲(chǔ)庫 。

    通過組成員身份安全訪問

    本教程的下一步是使用將在Okta上創(chuàng)建和定義的用戶組添加基于組的身份驗(yàn)證。 一個(gè)非常常見的示例是讓網(wǎng)站的“管理”部分和網(wǎng)站的“用戶”部分,以及可能向所有人開放的公共主頁。 在此示例中,“管理員”和“用戶”將對應(yīng)于兩個(gè)不同的組,其中經(jīng)過身份驗(yàn)證的用戶可以是其成員。 我們要做的是能夠基于用戶組成員身份限制對URL端點(diǎn)的訪問,并能夠?qū)⒂脩舴峙浣o這些組。

    旁注:小組與角色。 有什么不同?

    • “組”是用戶的集合,并且權(quán)限已分配給該組。 一般來說,至少在整個(gè)會(huì)話期間,組成員資格是相對靜態(tài)的。
    • “角色”是用戶在該角色下執(zhí)行操作時(shí)可以繼承的一組權(quán)限。 角色本質(zhì)上通常更具動(dòng)態(tài)性。 用戶可以具有許多角色。 經(jīng)常根據(jù)復(fù)雜的標(biāo)準(zhǔn)激活或停用角色,并且在整個(gè)用戶會(huì)話中經(jīng)常可能會(huì)更改角色。

    實(shí)際上,對于簡單的授權(quán)系統(tǒng),它們非常相似。 主要區(qū)別在于,組基于個(gè)人身份進(jìn)行分類,而角色則基于允許的活動(dòng)進(jìn)行分類。 您可能會(huì)在狂野的互聯(lián)網(wǎng)上看到無視這種差異的應(yīng)用程序和教程,因?yàn)樗鼈冊诠δ苌嫌行┪⒚睢?(但是現(xiàn)在您知道了。您可以進(jìn)入所涉及的教程的評論主題,并撰寫評論以糾正作者。)

    在Okta中配置授權(quán)組

    轉(zhuǎn)到您的developer.okta.com儀表板。 從頂部菜單中,轉(zhuǎn)到“ 用戶” ,然后單擊“ 組”

    單擊添加組按鈕。

    將組命名為“ Admin”并對其進(jìn)行描述(我放了“ Administrators”,無論您在這里實(shí)際輸入什么,都無所謂,只是描述性的)。

    單擊組名稱以打開組,然后單擊添加成員按鈕。 將您的用戶添加到Admin組。

    接下來,添加一個(gè)不是管理員的新用戶。

    • 從頂部菜單轉(zhuǎn)到“ 用戶 ”,然后單擊“ 人員”
    • 單擊添加人
    • 填寫彈出表單:
      • 名:不

    接下來您需要做的是向默認(rèn)授權(quán)服務(wù)器添加一個(gè)“組”聲明。

    • 從頂部菜單轉(zhuǎn)到API ,然后單擊“ 授權(quán)服務(wù)器
    • 單擊默認(rèn)授權(quán)服務(wù)器。
    • 單擊“ 索賠”選項(xiàng)卡。
    • 點(diǎn)擊添加聲明按鈕。
    • 更新彈出表單以匹配下面的圖像
      • 名稱:團(tuán)體

    您在這里所做的就是告訴Okta在發(fā)送給您的應(yīng)用程序的訪問令牌中包含“組”聲明。 這是Okta的OAuth方法,用于向您的應(yīng)用程序告知您已通過身份驗(yàn)證的用戶所屬的組。 令人困惑的是,這些在Spring應(yīng)用程序端被稱為“權(quán)威”,這是OAuth服務(wù)器與應(yīng)用程序通信的組/角色/特權(quán)的抽象術(shù)語。

    現(xiàn)在我們有兩個(gè)用戶。 您的主要用戶(已添加到Admin組中)和一個(gè)新用戶(不在admin組中)。 我們還配置了Okta,將群組聲明添加到訪問令牌中。 現(xiàn)在,我們要做的就是對應(yīng)用程序代碼進(jìn)行一些更改!

    更新您的Spring Boot + Spring Security App以使用基于組的授權(quán)

    Okta Spring Boot Starter真正開始發(fā)揮作用。 通常,如果您想將我們發(fā)送令牌的安全組和組聲明映射到應(yīng)用程序中的組,則必須編寫一兩個(gè)提取程序類來處理提取操作,也許還要編寫一個(gè)組類。 Okta Spring Boot Starter可以為您完成所有這些工作!

    您要做的第一件事是在SpringSecurityWebAppConfig類中添加以下注釋。

    @EnableGlobalMethodSecurity(prePostEnabled = true)

    像這樣:

    import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;@EnableOAuth2Sso @Configuration @EnableGlobalMethodSecurity(prePostEnabled = true) public class SpringSecurityWebAppConfig extends WebSecurityConfigurerAdapter { /* class contents omitted for brevity */ }

    此注釋啟用了我們將要使用的下一個(gè)注釋@PreAuthorize注釋。 該注釋使我們可以使用Spring Expression Language(SpEL)謂詞來確定控制器方法是否得到授權(quán)。 謂詞表達(dá)式會(huì)在應(yīng)用程序甚至進(jìn)入控制器方法之前執(zhí)行(因此需要“預(yù)先”授權(quán))。

    在SimpleAppController類中,添加一個(gè)名為admin的新方法,如下所示:

    import org.springframework.security.access.prepost.PreAuthorize;@Controller class SimpleAppController { /* other controllers omitted for clarity */ @RequestMapping("/admin") @PreAuthorize("hasAuthority('Admin')") String admin() { return "admin"; } }

    概括一下,此方法執(zhí)行以下操作:

    • 為/admin url端點(diǎn)創(chuàng)建一個(gè)映射;
    • 為/admin端點(diǎn)分配基于SpEL的授權(quán)方案;
    • 并簡單地返回Thymeleaf模板的名稱,假設(shè)該/templates位于/templates目錄中(我們將在下一個(gè)目錄中創(chuàng)建)。

    創(chuàng)建新的管理模板頁面。 在src/main/resources/templates目錄中,創(chuàng)建一個(gè)名為admin.html的新文件,其內(nèi)容如下:

    <html xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity4"> <head> <!--/*/ <th:block th:include="fragments/head :: head"/> /*/--> </head> <body> <div class="container-fluid"> <div class="row"> <div class="box col-md-6 col-md-offset-3"> <div class="okta-header"> <img src="img/logo.png"/> </div> <h1>Welcome to the admin page!</h1> <a href="/" class="btn btn-primary">Go Home</a> </div> </div> </div> </body> </html>

    您可能會(huì)問自己@PreAuthorize批注中使用的SpEL表達(dá)式是什么意思。 為什么SpEL表達(dá)式具有hasAuthority而不具有hasGroup ? 正確的答案有些復(fù)雜,這與Spring在不同上下文中調(diào)用權(quán)限特權(quán)和權(quán)限有關(guān),可以在應(yīng)用程序中將其映射到組和角色。 當(dāng)使用Spring Boot和OAuth時(shí),“權(quán)限”通常等同于“角色”,這很好。 但是您說我們使用的是群組,而不是角色? 對。 實(shí)際上,在這種情況下,這沒關(guān)系,因?yàn)镺kta知道我們在談?wù)撊航M,而應(yīng)用程序知道我們在談?wù)撊航M,并且在中間,我們僅使用group聲明和Authority字段來傳達(dá)文本代表用戶所屬組的字符串。

    有用的提示:

    如果要檢查Spring Boot App正在接收的身份驗(yàn)證信息,可以在return語句之前的控制器方法之一中添加以下行。

    Authentication authentication = SecurityContextHolder.getContext().getAuthentication();

    確實(shí)在此行上或其后設(shè)置一個(gè)斷點(diǎn),然后使用允許您檢查身份驗(yàn)證對象的調(diào)試器運(yùn)行該應(yīng)用程序。 這是學(xué)習(xí)和調(diào)試問題的好方法。

    試用您的新Spring Boot + Spring Security Web App!

    就是這樣。 您應(yīng)該能夠重新啟動(dòng)應(yīng)用程序并以兩個(gè)不同的用戶身份登錄。 只有添加到“管理員”組的用戶才能訪問“管理員”頁面。 您必須直接導(dǎo)航到http:// localhost:8080 / admin(因?yàn)槲覀儧]有添加鏈接或按鈕)。 如果您嘗試與其他用戶一起導(dǎo)航到管理頁面,則會(huì)看到漂亮的whitelabel錯(cuò)誤頁面,其中顯示403 /未經(jīng)授權(quán)的錯(cuò)誤。

    請記住,在用戶之間切換時(shí),您必須停止應(yīng)用程序,注銷您的developer.okta.com帳戶,然后重新啟動(dòng)應(yīng)用程序。 您也可以在瀏覽器中使用隱身窗口。

    本教程的這一部分與GroupsAuth標(biāo)記相對應(yīng),您可以使用以下命令git checkout tags/GroupsAuth 。

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

    您在這里取得了一些實(shí)際進(jìn)展。 您了解了如何創(chuàng)建一個(gè)簡單的Spring Boot應(yīng)用程序以及如何使用Thymeleaf模板。 您已經(jīng)了解到Okta使OAuth 2.0 Single Sign-On集成到您的應(yīng)用中有多么容易。 您已經(jīng)了解了如何使用WebSecurityConfigurerAdapter子類和http.authorizeRequests() API來限制對控制器端點(diǎn)的訪問。

    最后,您已經(jīng)了解了如何在Okta上創(chuàng)建組和用戶,如何將它們綁定到Spring Boot應(yīng)用程序中,以及如何使用@PreAuthorize批注根據(jù)組成員身份配置授權(quán)。

    如果您想查看這個(gè)完整的項(xiàng)目,可以在Github上找到該倉庫: https : //github.com/moksamedia/okta-spring-simple-app 。

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

    • 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

    如果您想深入研究,請查看Okta Spring Boot Starter GitHub頁面 。

    如果您對此帖子有任何疑問,請?jiān)谙旅嫣砑釉u論。 有關(guān)更多精彩內(nèi)容, 請?jiān)赥witter上關(guān)注@oktadev , 在Facebook上關(guān)注我們,或訂閱我們的YouTube頻道 。

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

    “使用Spring Boot和Spring Security在15分鐘內(nèi)構(gòu)建Web應(yīng)用程序”最初于2018年9月26日在Okta開發(fā)人員博客上發(fā)布。

    翻譯自: https://www.javacodegeeks.com/2019/02/build-web-app-spring-boot-spring-security.html

    總結(jié)

    以上是生活随笔為你收集整理的在15分钟内使用Spring Boot和Spring Security构建一个Web应用程序的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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