当前位置: 首页 > 知识库问答 >
问题:

获取具有相同标识符值的不同对象已与会话密钥斗篷关联

欧照
2023-03-14

我们试图通过Keycloak验证现有用户,因此实现了自定义SPI,并将自定义SPI添加为用户联合

原因:javax.persistence.EntityExistsException:具有相同标识符值的不同对象已与会话关联:[org.keycloak.storage.jpa.entity.FederatedUserRoleMappingEntity#org.keycloak.storage.jpa.entity.FederatedUserRoleMappingEntity$key@E3A03493]

我们正在尝试使用Keycloak进行身份验证,并使用自定义提供程序对用户进行身份验证,用户详细信息在使用存储提供程序SPI的自定义提供程序中

@Override
public UserModel getUserByUsername(String username, RealmModel realm) {
    UserModel userModel = new UserAdapter(session, realm, model, repository.findUserByUsernameOrEmail(username));
    RoleModel roleModel = realm.getRole("user");
    userModel.grantRole(roleModel);
    return userModel;

}

新手到keycloak任何帮助将非常感谢

共有1个答案

终翰学
2023-03-14

所以我在自定义SPI中自己解决了这个问题。发生这种情况的原因是缓存/数据库中已经有一个用户分配了这个角色。当您使用Keycloak上的表单登录时,它会向下调用SPI实现的接口,以便查找用户并将其缓存/存储在某个地方。

为了解决这个问题,您可以执行以下操作:

@Override
public UserModel getUserByUsername(String username, RealmModel realm) {
    UserModel userModel = new UserAdapter(session, realm, model, 
    repository.findUserByUsernameOrEmail(username));
    RoleModel roleModel = realm.getRole("user");

    //Change is here
    //---------------------------------------------------
    if (!userModel.getRoleMappings().contains(roleModel))
        userModel.grantRole(roleModel);
    //---------------------------------------------------        

    return userModel;
}

调用GrantRole方法后,如果角色当前被授予持久化用户,则抛出EntityExistsException。这应该能解决你的问题。

 类似资料: