Adding organization membership provider events

Signed-off-by: Pedro Igor <pigor.craveiro@gmail.com>
This commit is contained in:
Pedro Igor 2024-11-04 16:30:05 -03:00
parent 0a05ba49d1
commit b70303f293
3 changed files with 67 additions and 2 deletions

View File

@ -191,6 +191,7 @@ public class JpaOrganizationProvider implements OrganizationProvider {
}
user.joinGroup(group, metadata);
OrganizationModel.OrganizationMemberJoinEvent.fire(organization, user, session);
} finally {
if (current == null) {
session.getContext().setOrganization(null);
@ -430,6 +431,8 @@ public class JpaOrganizationProvider implements OrganizationProvider {
}
}
OrganizationModel.OrganizationMemberLeaveEvent.fire(organization, member, session);
return true;
}

View File

@ -22,6 +22,8 @@ import java.util.Map;
import java.util.Set;
import java.util.stream.Stream;
import org.keycloak.provider.ProviderEvent;
public interface OrganizationModel {
String ORGANIZATION_ATTRIBUTE = "kc.org";
@ -47,6 +49,54 @@ public interface OrganizationModel {
}
}
interface OrganizationMembershipEvent extends ProviderEvent {
OrganizationModel getOrganization();
UserModel getUser();
KeycloakSession getSession();
}
interface OrganizationMemberJoinEvent extends OrganizationMembershipEvent {
static void fire(OrganizationModel organization, UserModel user, KeycloakSession session) {
session.getKeycloakSessionFactory().publish(new OrganizationModel.OrganizationMemberJoinEvent() {
@Override
public UserModel getUser() {
return user;
}
@Override
public OrganizationModel getOrganization() {
return organization;
}
@Override
public KeycloakSession getSession() {
return session;
}
});
}
}
interface OrganizationMemberLeaveEvent extends OrganizationMembershipEvent {
static void fire(OrganizationModel organization, UserModel user, KeycloakSession session) {
session.getKeycloakSessionFactory().publish(new OrganizationModel.OrganizationMemberLeaveEvent() {
@Override
public UserModel getUser() {
return user;
}
@Override
public OrganizationModel getOrganization() {
return organization;
}
@Override
public KeycloakSession getSession() {
return session;
}
});
}
}
String getId();
void setName(String name);

View File

@ -1030,7 +1030,13 @@ public class UserResource {
try {
if (user.isMemberOf(group)){
user.leaveGroup(group);
adminEvent.operation(OperationType.DELETE).resource(ResourceType.GROUP_MEMBERSHIP).representation(ModelToRepresentation.toRepresentation(group, true)).resourcePath(session.getContext().getUri()).success();
adminEvent.operation(OperationType.DELETE)
.resource(ResourceType.GROUP_MEMBERSHIP)
.representation(ModelToRepresentation.toRepresentation(group, true))
.resourcePath(session.getContext().getUri())
.detail(UserModel.USERNAME, user.getUsername())
.detail(UserModel.EMAIL, user.getEmail())
.success();
}
} catch (ModelIllegalStateException e) {
logger.error(e.getMessage(), e);
@ -1057,7 +1063,13 @@ public class UserResource {
if (!RoleUtils.isDirectMember(user.getGroupsStream(),group)){
user.joinGroup(group);
adminEvent.operation(OperationType.CREATE).resource(ResourceType.GROUP_MEMBERSHIP).representation(ModelToRepresentation.toRepresentation(group, true)).resourcePath(session.getContext().getUri()).success();
adminEvent.operation(OperationType.CREATE)
.resource(ResourceType.GROUP_MEMBERSHIP)
.representation(ModelToRepresentation.toRepresentation(group, true))
.resourcePath(session.getContext().getUri())
.detail(UserModel.USERNAME, user.getUsername())
.detail(UserModel.EMAIL, user.getEmail())
.success();
}
}