feat: add keycloak role configuration
This commit is contained in:
@@ -13,6 +13,7 @@ import jakarta.ws.rs.core.Response;
|
||||
import org.eclipse.microprofile.config.inject.ConfigProperty;
|
||||
import org.jboss.logging.Logger;
|
||||
import org.keycloak.admin.client.Keycloak;
|
||||
import org.keycloak.admin.client.resource.RoleScopeResource;
|
||||
import org.keycloak.admin.client.resource.UserResource;
|
||||
import org.keycloak.representations.idm.GroupRepresentation;
|
||||
import org.keycloak.representations.idm.RoleRepresentation;
|
||||
@@ -94,6 +95,21 @@ public class KeycloakService {
|
||||
});
|
||||
}
|
||||
|
||||
public Uni<List<String>> fetchRole(String id) {
|
||||
return vertx.getOrCreateContext().executeBlocking(() ->
|
||||
keycloak.realm(realm).users().get(id).roles().realmLevel().listEffective().stream().map(RoleRepresentation::getName).toList());
|
||||
}
|
||||
|
||||
public Uni<?> updateRole(String id, List<String> toAdd, List<String> toRemove) {
|
||||
return vertx.getOrCreateContext().executeBlocking(() -> {
|
||||
RoleScopeResource resource = keycloak.realm(realm).users().get(id).roles().realmLevel();
|
||||
List<RoleRepresentation> roles = keycloak.realm(realm) .roles().list();
|
||||
resource.add(roles.stream().filter(r -> toAdd.contains(r.getName())).toList());
|
||||
resource.remove(roles.stream().filter(r -> toRemove.contains(r.getName())).toList());
|
||||
return "OK";
|
||||
});
|
||||
}
|
||||
|
||||
public Uni<String> initCompte(long id) {
|
||||
return membreService.getById(id).invoke(Unchecked.consumer(membreModel -> {
|
||||
if (membreModel.getUserId() != null)
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package fr.titionfire.ffsaf.rest;
|
||||
|
||||
import fr.titionfire.ffsaf.domain.service.KeycloakService;
|
||||
import fr.titionfire.ffsaf.rest.from.MemberPermForm;
|
||||
import io.smallrye.mutiny.Uni;
|
||||
import jakarta.annotation.security.RolesAllowed;
|
||||
import jakarta.inject.Inject;
|
||||
@@ -9,6 +10,9 @@ import jakarta.ws.rs.PUT;
|
||||
import jakarta.ws.rs.Path;
|
||||
import jakarta.ws.rs.PathParam;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
@Path("api/compte")
|
||||
public class CompteEndpoints {
|
||||
|
||||
@@ -28,4 +32,30 @@ public class CompteEndpoints {
|
||||
public Uni<?> initCompte(@PathParam("id") long id) {
|
||||
return service.initCompte(id);
|
||||
}
|
||||
|
||||
@GET
|
||||
@Path("{id}/roles")
|
||||
@RolesAllowed("federation_admin")
|
||||
public Uni<?> getRole(@PathParam("id") String id) {
|
||||
return service.fetchRole(id);
|
||||
}
|
||||
|
||||
@PUT
|
||||
@Path("{id}/roles")
|
||||
@RolesAllowed("federation_admin")
|
||||
public Uni<?> updateRole(@PathParam("id") String id, MemberPermForm form) {
|
||||
List<String> toAdd = new ArrayList<>();
|
||||
List<String> toRemove = new ArrayList<>();
|
||||
|
||||
if (form.isFederation_admin()) toAdd.add("federation_admin");
|
||||
else toRemove.add("federation_admin");
|
||||
if (form.isSafca_super_admin()) toAdd.add("safca_super_admin");
|
||||
else toRemove.add("safca_super_admin");
|
||||
if (form.isSafca_user()) toAdd.add("safca_user");
|
||||
else toRemove.add("safca_user");
|
||||
if (form.isSafca_create_compet()) toAdd.add("safca_create_compet");
|
||||
else toRemove.add("safca_create_compet");
|
||||
|
||||
return service.updateRole(id, toAdd, toRemove);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
package fr.titionfire.ffsaf.rest.from;
|
||||
|
||||
import jakarta.ws.rs.FormParam;
|
||||
import lombok.Getter;
|
||||
import lombok.ToString;
|
||||
|
||||
@Getter
|
||||
@ToString
|
||||
public class MemberPermForm {
|
||||
@FormParam("federation_admin")
|
||||
private boolean federation_admin;
|
||||
|
||||
@FormParam("safca_user")
|
||||
private boolean safca_user;
|
||||
|
||||
@FormParam("safca_create_compet")
|
||||
private boolean safca_create_compet;
|
||||
|
||||
@FormParam("safca_super_admin")
|
||||
private boolean safca_super_admin;
|
||||
}
|
||||
Reference in New Issue
Block a user