返回

Keycloak中新增实体,添加自定义业务逻辑

后端

使用 Keycloak 的自定义实体扩展身份管理

Keycloak 是一款强大的身份和访问管理 (IAM) 解决方案,可帮助组织安全地管理其用户的身份。它提供了高度可定制的平台,允许开发人员扩展其功能以满足特定需求。本文将深入探讨如何使用 Keycloak 的 SPI(服务提供商接口)向 Keycloak 添加自定义实体,从而存储和管理您自己的数据。

何为自定义实体?

自定义实体是您添加到 Keycloak 的定制数据对象,可用于存储特定于您的应用程序或业务逻辑的信息。它们提供了将您的自定义数据与 Keycloak 的强大身份管理功能相集成的灵活性。

创建自定义实体

要创建自定义实体,需要创建一个 Java 类来表示实体,并使用 JPA(Java Persistence API)进行注释以与数据库交互。例如,让我们创建一个名为 User 的简单实体:

import javax.persistence.*;

@Entity
@Table(name = "users")
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String username;
    private String password;
    private String email;

    // getters and setters
}

配置数据持久性

使用 Spring Data JPA 配置数据持久性,以便 Keycloak 可以访问您的实体。这涉及创建 DataSourceJpaRepository

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;

import javax.sql.DataSource;

@Configuration
@EnableJpaRepositories
public class DataSourceConfig {

    @Bean
    @ConfigurationProperties(prefix = "spring.datasource")
    public DataSource dataSource() {
        return DataSourceBuilder.create().build();
    }
}

public interface UserRepository extends JpaRepository<User, Long> {
}

注册自定义实体 SPI

使用 Keycloak 的 SPI 向其注册自定义实体。为此,需要创建实现 EntitySpiProvider 接口的 Java 类:

import org.keycloak.provider.Provider;
import org.keycloak.provider.ProviderFactory;
import org.keycloak.provider.Spi;
import org.keycloak.services.resource.RealmResourceProvider;

import java.util.Collections;
import java.util.List;

public class CustomEntitySpiProvider implements ProviderFactory<RealmResourceProvider>, Spi {

    @Override
    public List<Provider> getSpiImplementations() {
        return Collections.singletonList(new CustomEntityResourceProvider());
    }

    @Override
    public String getId() {
        return "custom-entity-spi-provider";
    }
}

创建自定义资源提供程序

自定义资源提供程序是处理自定义实体 API 请求的 Java 类。它需要实现 RealmResourceProvider 接口:

import org.keycloak.models.KeycloakSession;
import org.keycloak.models.RealmModel;
import org.keycloak.models.UserModel;
import org.keycloak.models.UserProvider;
import org.keycloak.provider.ProviderConfigProperty;
import org.keycloak.representations.idm.UserRepresentation;
import org.keycloak.services.resource.RealmResourceProvider;

import java.util.List;

public class CustomEntityResourceProvider implements RealmResourceProvider {

    @Override
    public Object getResource() {
        return new CustomEntityResource();
    }

    @Override
    public void init(RuntimeDelegate runtimeDelegate) {

    }

    @Override
    public void close() {

    }

    @Override
    public String getName() {
        return "custom-entity-resource-provider";
    }

    @Override
    public List<ProviderConfigProperty> getConfigProperties() {
        return Collections.emptyList();
    }

    private class CustomEntityResource {

        public List<UserRepresentation> getUsers(KeycloakSession session, RealmModel realm) {
            UserProvider userProvider = session.users();
            return userProvider.searchForUserByUsernamesStream(realm, Collections.singletonList("user"))
                    .map(UserModel::toRepresentation)
                    .toList();
        }
    }
}

配置 Keycloak

在 Keycloak 的管理控制台中,将自定义实体 SPI 添加到您的 realm:

  1. 导航到 Realm Settings > SPI
  2. 单击 Add new SPI
  3. 选择 Custom Entity SPI Provider

运行应用程序

启动 Spring Boot 应用程序,它将公开一个 REST 端点来管理您的自定义实体。

测试自定义实体

  1. 使用浏览器登录到 Keycloak 管理控制台
  2. 导航到 Users 页面
  3. 您应该会看到一个名为 "user" 的新用户,其中包含您在自定义实体中存储的信息

常见问题解答

1. 可以使用哪些数据类型来定义自定义实体?

Keycloak 支持各种数据类型,包括字符串、数字、布尔值和日期。

2. 我可以创建多个自定义实体吗?

是的,您可以创建任意数量的自定义实体。

3. 如何保护自定义实体的数据?

您可以使用 Keycloak 的访问控制和授权功能来控制对自定义实体数据的访问。

4. 我可以使用自定义实体存储敏感信息吗?

不建议将敏感信息存储在自定义实体中。使用 Keycloak 的内置加密和密钥管理功能来保护敏感信息。

5. 自定义实体是如何与 Keycloak 的用户和组集成的?

自定义实体与用户和组是独立的对象,但可以通过创建关系来关联它们。

结论

通过利用 Keycloak 的自定义实体,您可以轻松地向您的身份管理系统添加新的维度。它为您提供了将自定义数据与 Keycloak 的强大功能相集成的灵活性,从而为您的组织创建定制的身份管理解决方案。