From e9fedc90d45394673a0503f8a4348587d8be3bea Mon Sep 17 00:00:00 2001 From: Konstantinos Spyrou Date: Fri, 17 Feb 2023 20:40:51 +0200 Subject: [PATCH] experimental: temp save role if assign fails --- .../repo/manager/domain/PendingUserRole.java | 53 +++++++++++++++++++ .../repository/PendingUserRoleRepository.java | 9 ++++ .../service/PendingUserRoleService.java | 38 +++++++++++++ .../security/AuthorizationServiceImpl.java | 14 ++++- 4 files changed, 112 insertions(+), 2 deletions(-) create mode 100644 src/main/java/eu/dnetlib/repo/manager/domain/PendingUserRole.java create mode 100644 src/main/java/eu/dnetlib/repo/manager/repository/PendingUserRoleRepository.java create mode 100644 src/main/java/eu/dnetlib/repo/manager/service/PendingUserRoleService.java diff --git a/src/main/java/eu/dnetlib/repo/manager/domain/PendingUserRole.java b/src/main/java/eu/dnetlib/repo/manager/domain/PendingUserRole.java new file mode 100644 index 0000000..65dd507 --- /dev/null +++ b/src/main/java/eu/dnetlib/repo/manager/domain/PendingUserRole.java @@ -0,0 +1,53 @@ +package eu.dnetlib.repo.manager.domain; + +import javax.persistence.Entity; +import javax.persistence.Id; + +@Entity +public class PendingUserRole { + @Id + long id; + int coPersonId; + int couId; + + public PendingUserRole() { + // no-arg constructor + } + + public PendingUserRole(int coPersonId, int couId) { + this.coPersonId = coPersonId; + this.couId = couId; + } + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public int getCoPersonId() { + return coPersonId; + } + + public void setCoPersonId(int coPersonId) { + this.coPersonId = coPersonId; + } + + public int getCouId() { + return couId; + } + + public void setCouId(int couId) { + this.couId = couId; + } + + @Override + public String toString() { + return "PendingUserRole{" + + "coPersonId=" + coPersonId + + ", couId=" + couId + + '}'; + } +} diff --git a/src/main/java/eu/dnetlib/repo/manager/repository/PendingUserRoleRepository.java b/src/main/java/eu/dnetlib/repo/manager/repository/PendingUserRoleRepository.java new file mode 100644 index 0000000..6f1247a --- /dev/null +++ b/src/main/java/eu/dnetlib/repo/manager/repository/PendingUserRoleRepository.java @@ -0,0 +1,9 @@ +package eu.dnetlib.repo.manager.repository; + +import eu.dnetlib.repo.manager.domain.PendingUserRole; +import org.springframework.data.repository.CrudRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface PendingUserRoleRepository extends CrudRepository { +} diff --git a/src/main/java/eu/dnetlib/repo/manager/service/PendingUserRoleService.java b/src/main/java/eu/dnetlib/repo/manager/service/PendingUserRoleService.java new file mode 100644 index 0000000..4b907c1 --- /dev/null +++ b/src/main/java/eu/dnetlib/repo/manager/service/PendingUserRoleService.java @@ -0,0 +1,38 @@ +package eu.dnetlib.repo.manager.service; + +import eu.dnetlib.repo.manager.domain.PendingUserRole; +import eu.dnetlib.repo.manager.repository.PendingUserRoleRepository; +import eu.dnetlib.repo.manager.service.aai.registry.AaiRegistryService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Service; + +@Service +public class PendingUserRoleService { + + private static final Logger logger = LoggerFactory.getLogger(PendingUserRoleService.class); + private final PendingUserRoleRepository pendingUserRoleRepository; + private final AaiRegistryService aaiRegistryService; + + public PendingUserRoleService(PendingUserRoleRepository pendingUserRoleRepository, + AaiRegistryService aaiRegistryService) { + this.pendingUserRoleRepository = pendingUserRoleRepository; + this.aaiRegistryService = aaiRegistryService; + } + + @Scheduled(fixedRate = 3_600_000) + public void assignRoles() { + Iterable roles = pendingUserRoleRepository.findAll(); + for (PendingUserRole role : roles) { + logger.debug("Attempt to assign role: {}", role); + try { + aaiRegistryService.assignMemberRole(role.getCoPersonId(), role.getCouId()); + pendingUserRoleRepository.deleteById(role.getId()); + } catch (Exception e) { + logger.warn("Could not assign role to user. Pending Role: {}\n", role, e); + } + } + } + +} diff --git a/src/main/java/eu/dnetlib/repo/manager/service/security/AuthorizationServiceImpl.java b/src/main/java/eu/dnetlib/repo/manager/service/security/AuthorizationServiceImpl.java index d5d8f03..8305236 100644 --- a/src/main/java/eu/dnetlib/repo/manager/service/security/AuthorizationServiceImpl.java +++ b/src/main/java/eu/dnetlib/repo/manager/service/security/AuthorizationServiceImpl.java @@ -1,9 +1,11 @@ package eu.dnetlib.repo.manager.service.security; import com.google.gson.JsonElement; +import eu.dnetlib.repo.manager.domain.PendingUserRole; import eu.dnetlib.repo.manager.domain.dto.Role; import eu.dnetlib.repo.manager.domain.dto.User; import eu.dnetlib.repo.manager.exception.ResourceNotFoundException; +import eu.dnetlib.repo.manager.repository.PendingUserRoleRepository; import eu.dnetlib.repo.manager.service.aai.registry.AaiRegistryService; import org.mitre.openid.connect.model.OIDCAuthenticationToken; import org.mitre.openid.connect.model.UserInfo; @@ -30,13 +32,16 @@ public class AuthorizationServiceImpl implements AuthorizationService { private final RoleMappingService roleMappingService; private final AaiRegistryService aaiRegistryService; private final AuthoritiesUpdater authoritiesUpdater; + private final PendingUserRoleRepository pendingUserRoleRepository; @Autowired AuthorizationServiceImpl(RoleMappingService roleMappingService, AaiRegistryService aaiRegistryService, - AuthoritiesUpdater authoritiesUpdater) { + AuthoritiesUpdater authoritiesUpdater, + PendingUserRoleRepository pendingUserRoleRepository) { this.roleMappingService = roleMappingService; this.aaiRegistryService = aaiRegistryService; this.authoritiesUpdater = authoritiesUpdater; + this.pendingUserRoleRepository = pendingUserRoleRepository; } private String mapType(String type) { @@ -148,7 +153,12 @@ public class AuthorizationServiceImpl implements AuthorizationService { // Assign new role to the current authenticated user Integer coPersonId = aaiRegistryService.getCoPersonIdByIdentifier(); if (couId != null) { - aaiRegistryService.assignMemberRole(coPersonId, couId); + + try { + aaiRegistryService.assignMemberRole(coPersonId, couId); + } catch (Exception e) { + pendingUserRoleRepository.save(new PendingUserRole(coPersonId, couId)); + } // Add role to current user authorities authoritiesUpdater.addRole(roleMappingService.repositoryIdToAuthority(resourceId));