0

我想在 keycloak 中实现交易功能。我正在创建一个用户,然后是一个角色并将该角色与用户相关联。我希望在一个事务中完成所有这些操作。这是我的代码片段:

Keycloak keyClk = getKeyCloakInstance();
    UserRepresentation userRepresentation = new UserRepresentation();
    userRepresentation.setEnabled(user.getStatus());
    userRepresentation.setUsername(user.getUserId() != null ? user.getUserId() : "");
    userRepresentation.setEmail(user.getEmail());

    RealmResource realmResource = keyClk.realm(KeyCloakUtil.realmName);
    UsersResource usersRessource = realmResource.users();
    Response response = usersRessource.create(userRepresentation);
    List<Role> roleList = user.getRoles();
    if (!roleList.isEmpty() || roleList != null) {
        createUserRoleList(user.getUserId(), roleList, KeyCloakUtil.clientId, KeyCloakConstant.ACTION_ADD);
    }
4

2 回答 2

0

我不确定 keycloak 是否能够以事务方式处理该任务。我所做的是在 keycloak 中创建用户后,我会将创建的用户的引用保存在数据库中。如果您的工作流程出现问题,并且您可能最终在 keycloak 中有一些用户但在您的本地数据库中没有,这种方法是有风险的。

于 2021-06-19T16:31:46.080 回答
0

我知道你可以增强 keycloak 并创建一个新的 rest API。当您这样做时,您将可以访问 keycloak 事务类,并且可以在 s 事务下进行所有操作,至少这是我在搜索时所了解的。

我希望他们在不需要增强代码的情况下公开此功能。

另一种方法是自己模拟交易。在开始处理请求之前,请创建一个作业 ID 并将其与完成作业所需的信息一起存储。随时更新作业。如果代码失败,您可以恢复所做的更改。即使应用程序在重新启动时停止,您也可以检查作业并找到正在进行的作业并决定是否应该尝试完成它们或恢复更改。

于 2021-09-12T05:23:31.547 回答