知識庫 / Spring / Spring Boot RSS 訂閱

Spring Boot 和 Spring Security 中 SAML 的集成

Spring Boot,Spring Security
HongKong
7
11:38 AM · Dec 06 ,2025

1. 概述

在本教程中,我們將配置 Spring Boot 中的 SAML2。SAML2 是一種經過廣泛信任的技術,用於實現安全的應用程序。配置 SAML 需要多個方的配置,因此該過程有些複雜。我們需要在服務提供者和身份提供者之間來回切換幾次,因此在按照分步指南進行操作時,需要耐心。讓我們深入瞭解每個步驟,以創建我們的工作應用程序。

2. 設置服務提供者 (Sp)

在我們的案例中,Spring Boot 應用程序是我們的服務提供者。讓我們使用 Spring Security、Spring MVC 和 OpenSAML 依賴項設置一個 Spring Boot 應用程序。 關鍵依賴項是 Spring Security SAML2。 Spring Security 框架中新增的 SAML2 支持通過單個依賴項提供:

<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-saml2-service-provider</artifactId>
</dependency>

2.1. SAML 配置

現在,讓我們在我們的 application.yml 中添加必要的 SAML2 配置。 最重要的配置是身份提供商的元數據。 儘管我們已經將 metadata-uri 添加到我們的配置中以完成,但目前它尚未可用:

spring:
  security:
    saml2:
      relyingparty:
        registration:
          okta:
            signing:
              credentials:
                - private-key-location: classpath:local.key
                  certificate-location: classpath:local.crt
            singlelogout:
              binding: POST
              response-url: "{baseUrl}/logout/saml2/slo"
            assertingparty:
              metadata-uri: "classpath:metadata/metadata-idp.xml"

單點註銷配置定義了我們的身份提供商在成功註銷後將重定向到的端點。此外,簽名 憑證配置添加了我們的應用程序將用於向身份提供商簽名註銷請求的密鑰和證書。我們使用 OpenSSL 工具生成 local.keylocal.crt 文件:

openssl req -newkey rsa:2048 -nodes -keyout local.key -x509 -days 365 -out local.crt

2.2 代碼中的安全配置

在這一步中,讓我們為我們的過濾器鏈添加一個安全過濾器。該過濾器會將身份提供程序元數據添加到我們的安全上下文中。 此外,我們還應該在我們的 http 對象上調用 saml2Login()saml2Logout() 方法,分別啓用登錄和註銷:

Saml2MetadataFilter filter = new Saml2MetadataFilter(relyingPartyRegistrationResolver, new OpenSamlMetadataResolver());

http.csrf(AbstractHttpConfigurer::disable).authorizeHttpRequests(authorize -> authorize.anyRequest()
  .authenticated())
  .saml2Login(withDefaults())
  .saml2Logout(withDefaults())
  .addFilterBefore(filter, Saml2WebSsoAuthenticationFilter.class);

return http.build();

我們正在使用 <em withDefaults()</em 方法來配置 <em saml2Login</em><em saml2Logout</em> 的默認行為。 這正是使用 Spring Boot 平台的真正優勢。 僅需幾行代碼即可完成我們所有的 SAML2 應用程序設置。 接下來,我們將配置我們的 Identity Provider 在 Okta 中。

3. 設置身份提供者 (IdP)

在此步驟中,讓我們將 Okta 設置為我們的身份提供者。 身份提供者是驗證我們用户並生成 SAML 斷言的方。 然後,此 SAML 斷言會傳回給我們的用户代理。 用户代理會將此 SAML 斷言呈現給服務提供商以進行身份驗證。 服務提供商從身份提供者驗證它,並允許用户訪問其資源。

Okta 開發者賬户 中,在註冊並登錄後,您會看到一個左側側邊欄。 在側邊欄中,讓我們導航到“應用程序”頁面,並開始我們的 SAML 應用程序集成過程:

3.1. 創建應用集成

接下來,點擊“創建應用集成”以打開“創建新應用集成”對話框,並選擇 SAML 2.0:

我們將點擊“下一步”以啓動“創建 SAML 集成”嚮導。這是一個三步向導。讓我們完成每個步驟以完成我們的設置。

3.2. 通用設置

在此步驟中,我們將應用程序名稱設置為“Baeldung Spring Security SAML2 App”:

3.3. 配置 SAML

現在,我們將配置我們的 SAML 應用最重要的細節。在這裏,我們將註冊 Identity Provider 中的 Single Sign-on URL。 這樣,Identity Provider 就會接受來自該 URL 的 SSO 請求。 Audience URI 是 SAML 斷言接收者的標識符。 此標識符會添加到生成的併發送回用户代理的 SAML 斷言中:

在我們的示例中,Audience URI 是 http://localhost:8080/saml2/service-provider-metadata/okta,而 Single Sign-on URL 是 http://localhost:8080/login/saml2/sso/okta

3.4. 高級設置和用户屬性

現在我們來擴展“顯示高級設置”部分。為了啓用<em >singlelogout</em>功能,我們需要在這裏上傳<em >local.crt</em>證書。**這與我們在服務提供者<em >application.yml</em>中配置的證書相同。服務提供者使用該證書對登出請求進行簽名。

此外,我們還需要將“單點登出 URL”配置為<em >http://localhost:8080/logout/saml2/slo</em>

最後,我們還配置了<em >emailAddress</em><em >firstName</em>的屬性聲明:

emailAddress -> 未指定 -> user.email


firstName -> 未指定 -> user.firstName

請使用“預覽 SAML 斷言”鏈接在步驟底部預覽斷言,然後再進入“下一步”步驟。

3.5. 最終反饋

在反饋步驟中,請選擇“我是一名添加內部應用的 Okta 客户”。

3.6. SAML 配置指南

完成反饋步驟後,我們將進入應用程序的“登錄”選項卡。 在該屏幕上,請按照右側側邊欄底部鏈接“查看 SAML 配置指南”:

這將帶您到一個包含 Identity Provider 相關必要信息的頁面。 接下來,請移動到包含 Identity Provider 元數據的最後一個字段:

我們複製該元數據,並將其保存為 <em metadata-idp-okta.xml</em> 在我們的 Service Provider 應用 <em resources/metadata</em> 文件夾中,從而滿足 <em metadata_uri</em> 在我們 <em application.yml</em> 中的要求:

此操作完成 Service Provider 和 Identity Provider 的配置。 接下來,我們將創建一個用户並將其分配到我們的應用程序,在 Okta 開發者賬户中。

4. 創建用户主體

請登錄 Okta 開發者賬户,並在左側側邊欄的“目錄”部分下的“人員”頁面中導航。 在這裏,我們將填寫“添加人員”表單以創建用户。 有時,可能需要刷新“人員”頁面才能在列表中看到新用户:

在這種情況下,我們正在自動激活用户。 通常,您可能希望發送激活電子郵件或切換開關,以便用户在首次嘗試時更改分配的密碼。

最後,我們點擊“分配”並遵循幾個步驟將新用户分配到我們的 SAML 應用中。

5. 測試應用程序

現在,我們準備好測試我們的應用程序。啓動我們的 Spring Boot 應用程序,並在應用程序的默認端點上打開它:http://localhost:8080。這將帶您進入登錄屏幕:

接下來,您將到達成功登錄後的頁面。除了用户名之外,該頁面還會顯示用户屬性,例如 emailAddressfirstName

此步驟完成了我們 SAML 應用程序的設置。但是,在離開之前,讓我們檢查一個最後的事情:退出登錄按鈕


首先,我們需要設置 屬性,該屬性是您的 Okta 標識符(您可以在 URL 中看到它):

spring:
  security:
    saml2:
      relyingparty:
        registration:
          okta:
            ...
            singlelogout:
              url: https://dev-<OKTA-ID>.okta.com/app/dev-56617222_springbootsaml_1/exk8b5jr6vYQqVXp45d7/slo/saml
              binding: POST
              response-url: "{baseUrl}/logout/saml2/slo"

然後,我們就能註銷所有針對已登錄用户的一系列 SAML 會話:

6. 結論

在本文中,我們學習了 Spring Boot Security 的 SAML2 支持。儘管 SAML2 是一種複雜的技術,但對於大型企業來説,它是首選方案。一旦我們理解了 SAML2,就能充分利用它提供的強大功能。除了安全我們的應用程序之外,SAML2 還允許我們使用單點登錄 (SSO) 並避免為數十個應用程序記住多個用户名和密碼。

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.