mirror of
https://github.com/keycloak/keycloak.git
synced 2026-02-18 18:37:54 -05:00
Optimize user joining group or role
Closes #45689 Signed-off-by: Alexander Schwartz <alexander.schwartz@ibm.com>
This commit is contained in:
parent
3f62bb4d2b
commit
3f8b1c8e70
1 changed files with 26 additions and 1 deletions
|
|
@ -442,9 +442,21 @@ public class UserAdapter implements UserModel, JpaModel<UserEntity> {
|
|||
joinGroup(group, null);
|
||||
}
|
||||
|
||||
private boolean hasDirectGroup(GroupModel group) {
|
||||
UserGroupMembershipEntity membership = em.createNamedQuery("userMemberOf", UserGroupMembershipEntity.class)
|
||||
.setParameter("user", user)
|
||||
.setParameter("groupId", group.getId())
|
||||
.getSingleResultOrNull();
|
||||
// Avoid keeping it in the persistence context, as the user might be detached for example in a bulk delete
|
||||
if (membership != null) {
|
||||
em.detach(membership);
|
||||
}
|
||||
return membership != null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void joinGroup(GroupModel group, MembershipMetadata metadata) {
|
||||
if (RoleUtils.isDirectMember(getGroupsStream(), group)) return;
|
||||
if (hasDirectGroup(group)) return;
|
||||
joinGroupImpl(group, metadata);
|
||||
}
|
||||
|
||||
|
|
@ -513,6 +525,19 @@ public class UserAdapter implements UserModel, JpaModel<UserEntity> {
|
|||
RoleGrantedEvent.fire(role, this, session);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasDirectRole(RoleModel role) {
|
||||
UserRoleMappingEntity membership = em.createNamedQuery("userHasRole", UserRoleMappingEntity.class)
|
||||
.setParameter("user", user)
|
||||
.setParameter("roleId", role.getId())
|
||||
.getSingleResultOrNull();
|
||||
// Avoid keeping it in the persistence context, as the user might be detached for example in a bulk delete
|
||||
if (membership != null) {
|
||||
em.detach(membership);
|
||||
}
|
||||
return membership != null;
|
||||
}
|
||||
|
||||
public void grantRoleImpl(RoleModel role) {
|
||||
UserRoleMappingEntity entity = new UserRoleMappingEntity();
|
||||
entity.setUser(getEntity());
|
||||
|
|
|
|||
Loading…
Reference in a new issue