我们试图通过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任何帮助将非常感谢
所以我在自定义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
。这应该能解决你的问题。
此方法以事务开头 这是一个映射器类,我在其中创建DB帐户实体并映射地址和联系人。 当我不在地图内调用下面的方法时,一切都正常工作。但是当我调用它时,我得到了标题中描述的错误。 最后的方法是 异常堆栈跟踪 null
我有以下问题: 有人对此有解释吗?我考虑从我的业务服务中的hibernate会话中重新加载对象,并从Struts HTTP会话中复制实体对象中的数据。 Hibernate映射
null 对于我的数据,我有时会遇到这样的问题:A有一组不同的B对象,而这些B对象引用同一个C对象。 当我调用时,我会得到一个hibernate错误:。我知道hibernate不能在同一个会话中插入/更新/删除同一个对象两次,但是有什么方法可以解决这个问题吗?这似乎并不是一种罕见的情况。 在我研究这个问题的过程中,我看到有人建议使用,但当我这样做时,任何“冲突”对象都会作为所有值都设置为null的
问题内容: 在使用Spring和Hibernate的应用程序中,我解析CSV文件,并在每次从CSV文件中读取记录时通过调用来填充db 。 我的域模型: “家庭”有很多“子家庭” “子家庭”有很多“位置” “ Locus”属于“ Species” 都是双向映射。 码: 使用以下方法将物种分配给场所,该方法仅访问DAO层: Hibernate给出以下错误: 有小费吗? 问题答案: 使用。该异常表示当前
问题内容: 我有两个用户对象,而在尝试使用以下方法保存对象时 我收到以下错误: 我正在使用创建会话 我还尝试过在保存之前进行操作,但仍然没有运气。 这是我第一次在用户请求到来时获取会话对象,因此我要为什么要说该对象存在于会话中。 有什么建议么? 问题答案: 我已经多次发生此错误,很难追踪… 基本上,hibernate是指您有两个具有相同标识符(相同主键)但不是相同对象的对象。 我建议您分解代码,即
问题内容: 我基本上在此配置中有一些对象(实际数据模型要复杂一些): A与B有多对多关系。(B具有) B与C具有多对一关系(我已设置为) C是一种类型/类别表。 另外,我可能应该提到主键是在保存时由数据库生成的。 使用我的数据,有时我会遇到一个问题,其中A具有一组不同的B对象,而这些B对象引用了相同的C对象。 打电话时,我收到了一个hibernate错误消息:。我知道hibernate无法在同一会