Spring Security 與 Okta

Spring Security
Remote
1
05:47 AM · Nov 30 ,2025

1. 概述

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

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

2. 設置 Okta

2.1. 開發人員賬户註冊

首先,我們將註冊一個免費的 Okta 開發人員賬户,該賬户提供最多 1k 個每月活躍用户訪問權限。但是,如果我們已經擁有一個,我們可以跳過此部分:

Screen-Shot-2020-04-30 at-11.52.36-AM

2.2. 儀表盤

登錄到 Okta 開發人員賬户後,我們將到達儀表盤屏幕,該屏幕會向我們提供有關用户、認證和失敗登錄的摘要。

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

Screen-Shot-2020-04-30-at-3.48.49-PM

 

此外,我們會注意到儀表盤右上角的 組織 URL,該 URL 用於 Okta 設置,用於我們稍後創建的 Spring Boot 應用程序。

2.3. 創建新的應用程序

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

此外,我們會選擇 Web 平台,從可用的選項中選擇,如 原生單頁面應用程序服務

Screen-Shot-2020-04-30-at-11.58.42-AM

2.4. 應用程序設置

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

Screen-Shot-2020-04-30-at-12.08.56-PM

此外,請確保標記 授權碼 用於 允許的 授權類型,用於啓用 Web 應用程序的 OAuth2 認證。

2.5. 客户端憑據

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

Screen-Shot-2020-04-30-at-12.10.59-PM

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

3. Spring Boot 應用設置現在,我們的 Okta 開發人員帳户已準備就緒,並具有必要的配置,我們已準備好在 Spring Boot 應用中集成 Okta 安全支持。

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 的指向 {orgURL}/oauth2/default 的方式

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

Screen-Shot-2020-05-02-at-8.21.07-PM

然後,我們將我們在上一部分中生成的 Okta 應用的 Client IdClient secret 添加到其中。

最後,我們已配置相同的 redirect-uri,該 redirect-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 提供的一個默認登錄頁面:

Screen-Shot-2020-05-01-at-6.54.18-PM

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

Screen-Shot-2020-05-03-at-9.00.15-AM

此外,我們將在默認登錄屏幕底部找到一個“註冊”鏈接,用於自注冊。

5. 註冊

5.1. 自動註冊

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

Screen-Shot-2020-05-03-at-12.06.36-PM

5.2. 創建用户

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

Screen-Shot-2020-05-03-at-12.04.33-PM

5.3. 自助註冊設置

此外,註冊和設置可以在 Okta 開發者賬户的 Users 菜單中進行配置:

Screen-Shot-2020-05-03-at-12.05.47-PM

6. Okta Spring SDK

Now that we’ve seen Okta security integration in the Spring Boot App, let’s interact with the Okta management API in the same app.

First, we should create a Token by using the API menu in the Okta developer account:

Screen-Shot-2020-05-01-at-6.23.53-PM

Make sure to note down the Token as it is shown only once after generation. Then, it’ll be stored as a hash for our protection.

6.1. Setup

Then, let’s add the latest okta-spring-sdk Maven dependency to our pom.xml:

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

6.2. application.properties

Next, we’ll add a few essential Okta client properties:

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

Here, we’ve added the token noted in the previous section.

6.3. AdminController

Last, let’s create the AdminController, injected with the Client instance:

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

That’s it! We’re ready to call methods on the Client instance to make requests to the Okta API.

6.4. List Users

Let’s create the getUsers method to fetch a list of all users in our organization, using the listUsers method that returns a UserList object:

public class AdminController {
    // ...

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

After that, we can access localhost:8080/users to receive a JSON response containing all users:

{
    "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. Search User

Similarly, we can filter users using the firstName, lastName, or email as query parameters:

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

Let’s search for a user by email using localhost:8080/[email protected]:

{
    "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. Create User

Also, we can create a new user by using the instance method of the UserBuilder interface:

@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;
}

So, let’s access localhost:8080/createUser and verify new user’s details:

{
    "id": "00uauveccPIYxQKUf4x6",   
    "profile": {
        "firstName": "Norman",
        "lastName": "Lewis",
        "email": "[email protected]"
    },
    "credentials": {
        "password": {},
        "emails": [
            {
                "value": "[email protected]",
                "status": "VERIFIED",
                "type": "PRIMARY"
            }
        ],
        // ...
    }
}

Similarly, we can perform a range of operations like listing all applications, creating an application, listing all groups, and creating a group.

7. 結論

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

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

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

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

發佈 評論

Some HTML is okay.