知識庫 / Spring / Spring Security RSS 訂閱

Spring Security 與 Okta 集成

Spring Security
HongKong
6
12:59 PM · Dec 06 ,2025

1. 概述

Okta 提供身份驗證、授權和社交登錄等功能,適用於 Web、移動或 API 服務。 此外,它還對 Spring Framework 提供了強大的支持,從而使集成變得非常簡單。

在本教程中,我們將探索 Spring Security 與 Okta 結合使用,並設置一個最小化的 Okta 開發者賬户。

2. 設置 Okta

Okta 的設置過程如下:

  1. 創建 Okta 組織

    • 在 Okta 網站上創建一個新的 Okta 組織。
    • 按照提示填寫組織信息,包括域名、管理員郵箱等。
  2. 添加用户

    • 在 Okta 管理控制枱中,添加需要訪問 Okta 應用的用户。
    • 為每個用户設置密碼,並配置他們的角色和權限。
  3. 配置 Okta 應用

    • 根據需要,配置 Okta 應用,例如:
      • 設置身份驗證方法(例如:密碼、多因素身份驗證)。
      • 配置 SAML 2.0 或 OIDC 身份驗證。
      • 設置應用的屬性和自定義設置。
  4. 集成應用

    • 將 Okta 應用與您的應用程序集成,以便用户可以使用 Okta 進行身份驗證。
    • 按照應用程序的文檔,配置應用程序以使用 Okta 進行身份驗證。
  5. 測試集成

    • 完成集成後,務必進行測試,以確保用户可以成功使用 Okta 進行身份驗證。

2.1. 開發者賬户註冊

首先,我們將註冊一個免費的 Okta 開發者賬户,該賬户可提供高達每月 1000 個活躍用户的訪問權限。但是,如果已經擁有一個賬户,則可以跳過此部分。

2.2. 儀表盤

登錄到 Okta 開發人員帳户後,您將到達儀表盤屏幕,該屏幕會提供有關用户數、身份驗證次數和失敗登錄次數的信息。

此外,它還顯示了系統的詳細日誌記錄:

您還會注意到儀表盤右上角顯示的 組織 URL,該 URL 用於在稍後創建的 Spring Boot 應用程序中設置 Okta。

2.3. 創建新應用程序

然後,我們使用“應用程序”菜單創建一個用於 Spring Boot 的 OpenID Connect (OIDC) 應用程序。

此外,我們還將從可用的選項中選擇 Web 平台,例如 Native單頁應用程序服務

2.4. 應用程序設置

接下來,讓我們配置一些應用程序設置,例如 基本 URI登錄重定向 URI,指向我們的應用程序:

此外,請確保標記 授權碼 用於 允許的授權類型,以便為 Web 應用程序啓用 OAuth2 身份驗證。

2.5. 客户端憑據

然後,我們將獲取與我們的應用程序關聯的 客户端 ID客户端密鑰 的值:

請妥善保管這些憑據,因為它們是 Okta 設置所需的。

3. Spring Boot 應用設置

現在,我們的 Okta 開發者賬户已準備就緒,並配置了必要的設置,我們已準備好將 Okta 安全支持集成到 Spring Boot 應用中。

3.1. Maven

首先,讓我們將最新的 okta-spring-boot-starter Maven 依賴添加到我們的 pom.xml 中:

<dependency>
    <groupId>com.okta.spring</groupId>
    <artifactId>okta-spring-boot-starter</artifactId>
    <version>3.0.6</version>
</dependency>

3.2. Gradle

同樣,在使用 Gradle 時,可以在 build.gradle 中添加 okta-spring-boot-starter 依賴:

compile 'com.okta.spring:okta-spring-boot-starter:1.4.0'

3.3. application.properties

接下來,我們將配置 Okta oauth2 屬性,位於 application.properties 中:

okta.oauth2.issuer=https://dev-example123.okta.com/oauth2/default
okta.oauth2.client-id=1230oaa4yncmaxaQ90ccJwl4x6
okta.oauth2.client-secret=hjiyblEzgT0ItY91Ywcdzwa78oNhtrYqNklQ5vLzvruT123
okta.oauth2.redirect-uri=/authorization-code/callback

在這裏,我們可以使用默認的授權服務器(如果未提供其他選項)來設置 發行者(issuer) URL,該 URL 指向 {orgURL}/oauth2/default

此外,我們可以在 Okta 開發人員帳户中通過使用 API 菜單創建新的授權服務器:

然後,我們將從上一部分生成的 Okta 應用的 客户端 ID客户端密鑰 添加到。

最後,我們已配置與在應用程序設置中設置的相同的 重定向 URI

4. HomeController

接下來,我們創建 HomeController 類:

@RestController
public class HomeController {
    @GetMapping("/")
    public String home(@AuthenticationPrincipal OidcUser user) {
        return "Welcome, "+ user.getFullName() + "!";
    }
}

在這裏,我們添加了 home 方法,並配置了 Base Uri (/) 映射,該映射位於應用程序設置中。

此外,home 方法的參數是一個 OidcUser 類實例,該類由 Spring Security 提供,用於訪問用户信息。

就這麼簡單!我們的 Spring Boot App 已經配置了 Okta 安全支持。讓我們使用 Maven 命令運行我們的應用程序:

mvn spring-boot:run

訪問應用程序時,在 localhost:8080,我們將看到 Okta 提供的默認登錄頁面:

使用註冊用户憑據登錄後,將顯示包含用户全名的歡迎消息:

此外,我們會在默認登錄屏幕的底部找到“註冊”鏈接,用於自助註冊。

5. 註冊

5.1. 自注冊

首次使用時,您可以通過“註冊”鏈接創建 Okta 賬户,並提供如電子郵件、名字和姓氏等信息:

5.2. 創建用户

或者,我們可以從 Okta 開發人員賬户的 Users 菜單中創建一個新用户:

5.3. 自助註冊設置

此外,可以通過 Okta 開發者賬户中的 用户 菜單配置註冊和登錄設置。

6. Okta Spring SDK

現在我們已經瞭解了在 Spring Boot 應用中集成 Okta 安全,接下來將在同一應用中與 Okta 管理 API 進行交互。

首先,我們應該通過 Okta 開發者賬户的 API 菜單創建 令牌

請務必 記錄 令牌,因為它在生成後僅顯示一次。然後,它將被存儲為我們的保護哈希。

6.1. 部署準備

然後,我們將最新的 okta-spring-sdk Maven 依賴添加到我們的 pom.xml 中:

<dependency>
    <groupId>com.okta.spring</groupId>
    <artifactId>okta-spring-sdk</artifactId>
    <version>1.4.0</version>
</dependency>

6.2. application.properties</h3

接下來,我們將添加一些必要的 Okta 客户端屬性:

okta.client.orgUrl=https://dev-example123.okta.com
okta.client.token=00TVXDNx1e2FgvxP4jLlONbPMzrBDLwESSf9hZSvMI123

在此,我們添加了之前章節中提到的令牌。

6.3. AdminController

最後,我們創建 AdminController,並注入了 Client 實例:

@RestController
public class AdminController {
    @Autowired
    public Client client;
}

這就是全部!我們準備好調用 Client 實例的方法,向 Okta API 發送請求。

6.4. 獲取用户列表

讓我們創建一個名為 getUsers 的方法,以從組織中檢索所有用户列表,並使用 listUsers 方法返回 UserList 對象:

public class AdminController {
    // ...

    @GetMapping("/users") 
    public UserList getUsers() { 
        return client.listUsers(); 
    }
}

之後,我們可以通過訪問 localhost:8080/users 來獲取一個包含所有用户的 JSON 響應:

{
    "dirty":false,
    "propertyDescriptors":{
        "items":{
            "name":"items",
            "type":"com.okta.sdk.resource.user.User"
        }
    },
    "resourceHref":"/api/v1/users",
    "currentPage":{
        "items":[
            {
                "id":"00uanxiv7naevaEL14x6",
                "profile":{
                    "firstName":"Anshul",
                    "lastName":"Bansal",
                    "email":"[email protected]",
                    // ...
                },
                // ...
            },
            { 
                "id":"00uag6vugXMeBmXky4x6", 
                "profile":{ 
                    "firstName":"Ansh", 
                    "lastName":"Bans", 
                    "email":"[email protected]",
                    // ... 
                }, 
                // ... 
            }
        ]
    },
    "empty":false,
    // ...
}

6.5. 搜索用户

同樣,我們可以使用 firstName、lastName 或 email 作為查詢參數來過濾用户

@GetMapping("/user")
public UserList searchUserByEmail(@RequestParam String query) {
    return client.listUsers(query, null, null, null, null);
}

讓我們通過email 搜索用户,使用以下鏈接:localhost:8080/郵箱http://localhost:8080/user?query=ansh@bans.com

{
    "dirty":false,
    "propertyDescriptors":{
        "items":{
            "name":"items",
            "type":"com.okta.sdk.resource.user.User"
        }
    },
    "resourceHref":"/api/v1/users?q=ansh%40bans.com",
    "currentPage":{
        "items":[
            {
                "id":"00uag6vugXMeBmXky4x6",
                "profile":{
                    "firstName":"Ansh",
                    "lastName":"Bans",
                    "email":"[email protected]",
                    // ...
                },
                // ...
            }
        ]
    },
    // ...
}

6.6. 創建用户

此外,我們還可以通過使用 UserBuilder 接口的 instance 方法創建新的用户:

@GetMapping("/createUser")
public User createUser() {
    char[] tempPassword = {'P','a','$','$','w','0','r','d'};
    User user = UserBuilder.instance()
        .setEmail("[email protected]")
        .setFirstName("Norman")
        .setLastName("Lewis")
        .setPassword(tempPassword)
        .setActive(true)
        .buildAndCreate(client);
    return user;
}

讓我們訪問 localhost:8080/createUser 並驗證新用户的詳細信息:

{
    "id": "00uauveccPIYxQKUf4x6",   
    "profile": {
        "firstName": "Norman",
        "lastName": "Lewis",
        "email": "[email protected]"
    },
    "credentials": {
        "password": {},
        "emails": [
            {
                "value": "[email protected]",
                "status": "VERIFIED",
                "type": "PRIMARY"
            }
        ],
        // ...
    },
    "_links": {
        "resetPassword": {
            "href": "https://dev-example123.okta.com/api/v1/users/00uauveccPIYxQKUf4x6/lifecycle/reset_password",
            "method": "POST"
        },
        // ...
    }
}

同樣,我們還可以執行一系列操作,例如列出所有應用程序、創建應用程序、列出所有組以及創建組。

7. 結論

在本快速教程中,我們探討了 Spring Security 與 Okta 的集成。

首先,我們設置了 Okta 開發者賬户並進行了必要的配置。然後,我們創建了一個 Spring Boot 應用,並配置了 application.properties 以進行 Spring Security 與 Okta 的集成。

接下來,我們集成 Okta Spring SDK 以管理 Okta API。最後,我們瞭解了列出所有用户、搜索用户和創建用户等功能。

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

發佈 評論

Some HTML is okay.