diff --git a/pom.xml b/pom.xml
index a26f0a069..02a2a3b8c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -15,7 +15,7 @@
Self Care Dashboard Backend
- 2.5.10
+ 2.5.11
https://sonarcloud.io/
diff --git a/src/main/java/it/pagopa/selfcare/dashboard/security/SelfCarePermissionEvaluatorV2.java b/src/main/java/it/pagopa/selfcare/dashboard/security/SelfCarePermissionEvaluatorV2.java
index 639d32149..57f820a19 100644
--- a/src/main/java/it/pagopa/selfcare/dashboard/security/SelfCarePermissionEvaluatorV2.java
+++ b/src/main/java/it/pagopa/selfcare/dashboard/security/SelfCarePermissionEvaluatorV2.java
@@ -29,6 +29,10 @@ public class SelfCarePermissionEvaluatorV2 implements PermissionEvaluator {
private final UserGroupRestClient userGroupRestClient;
private final UserApiRestClient userApiRestClient;
static final String REQUIRED_GROUP_ID_MESSAGE = "A user group id is required";
+ private static final String ISSUER_PAGOPA = "PAGOPA";
+ private static final List PAGOPA_ALLOWED_PERMISSIONS = List.of(
+ "Selc:ViewInstitutionData"
+ );
public SelfCarePermissionEvaluatorV2(UserGroupRestClient restClient, UserApiRestClient userApiRestClient) {
@@ -73,7 +77,22 @@ public boolean hasPermission(Authentication authentication, Object targetDomainO
log.debug(LogUtils.CONFIDENTIAL_MARKER, "hasPermission authentication = {}, targetDomainObject = {}, permission = {}", authentication, targetDomainObject, permission);
Assert.notNull(permission, "A permission type is required");
boolean result = false;
- String userId = ((SelfCareUser) authentication.getPrincipal()).getId();
+
+ SelfCareUser selfCareUser = (SelfCareUser) authentication.getPrincipal();
+ String userId = selfCareUser.getId();
+ String issuer = selfCareUser.getIssuer();
+
+ if (ISSUER_PAGOPA.equalsIgnoreCase(issuer)) {
+ log.debug("Issuer is PAGOPA, evaluating permission {}", permission);
+
+ boolean isAllowed = PAGOPA_ALLOWED_PERMISSIONS.stream()
+ .anyMatch(p -> p.equalsIgnoreCase(permission.toString()));
+
+ log.debug("PAGOPA permission {} → {}", permission, isAllowed ? "GRANTED" : "DENIED");
+ log.trace("check Permission end (issuer PAGOPA)");
+ return isAllowed;
+ }
+
if (targetDomainObject instanceof FilterAuthorityDomain filterAuthorityDomain) {
if (StringUtils.hasText(filterAuthorityDomain.getGroupId())) {
UserGroupInfo userGroupInfo = getUserGroupById(filterAuthorityDomain.getGroupId());
diff --git a/src/main/java/it/pagopa/selfcare/dashboard/service/InstitutionV2ServiceImpl.java b/src/main/java/it/pagopa/selfcare/dashboard/service/InstitutionV2ServiceImpl.java
index b9b069519..da1df8dbd 100644
--- a/src/main/java/it/pagopa/selfcare/dashboard/service/InstitutionV2ServiceImpl.java
+++ b/src/main/java/it/pagopa/selfcare/dashboard/service/InstitutionV2ServiceImpl.java
@@ -23,6 +23,7 @@
import org.springframework.core.io.Resource;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.AccessDeniedException;
+import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Service;
import org.springframework.util.Assert;
@@ -39,6 +40,7 @@ public class InstitutionV2ServiceImpl implements InstitutionV2Service {
static final String REQUIRED_INSTITUTION_MESSAGE = "An Institution id is required";
private static final String REQUIRED_USER_ID = "A user id is required";
private static final String A_USER_INFO_FILTER_OBJECT_IS_REQUIRED = "A UserInfoFilter object is required";
+ public static final String ISSUER_PAGOPA = "PAGOPA";
private final List allowedStates;
private final UserApiRestClient userApiRestClient;
@@ -100,13 +102,24 @@ public Institution findInstitutionById(String institutionId) {
log.trace("findInstitutionById start");
log.debug("findInstitutionById institutionId = {}", Encode.forJava(institutionId));
Assert.hasText(institutionId, REQUIRED_INSTITUTION_MESSAGE);
- String userId = ((SelfCareUser) SecurityContextHolder.getContext().getAuthentication().getPrincipal()).getId();
log.trace("getInstitution start");
log.debug("getInstitution institutionId = {}", Encode.forJava(institutionId));
Institution institution = institutionMapper.toInstitution(coreInstitutionApiRestClient._retrieveInstitutionByIdUsingGET(institutionId, null).getBody());
log.debug("getInstitution result = {}", institution);
log.trace("getInstitution end");
log.trace("getUserInstitutionWithActions start");
+
+ Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
+ SelfCareUser selfCareUser = (SelfCareUser) authentication.getPrincipal();
+ String issuer = selfCareUser.getIssuer();
+
+ if (ISSUER_PAGOPA.equalsIgnoreCase(issuer)) {
+ log.debug("Issuer is PAGOPA, skipping user-institution permission checks");
+ return institution;
+ }
+
+ String userId = selfCareUser.getId();
+
UserInstitutionWithActionsDto userInstitutionWithActionsDto = userMapper.toUserInstitutionWithActionsDto(userApiRestClient._getUserInstitutionWithPermission(institutionId, userId, null).getBody());
if (Objects.isNull(userInstitutionWithActionsDto))
diff --git a/src/test/java/it/pagopa/selfcare/dashboard/security/SelfCarePermissionEvaluatorV2Test.java b/src/test/java/it/pagopa/selfcare/dashboard/security/SelfCarePermissionEvaluatorV2Test.java
index 198829de3..3045f568a 100644
--- a/src/test/java/it/pagopa/selfcare/dashboard/security/SelfCarePermissionEvaluatorV2Test.java
+++ b/src/test/java/it/pagopa/selfcare/dashboard/security/SelfCarePermissionEvaluatorV2Test.java
@@ -87,4 +87,24 @@ void hasPermissionReturnsFalseForInvalidDirectPermission() {
assertFalse(permissionEvaluator.hasPermission(authentication, new FilterAuthorityDomain("institutionId", "productId", null), "Selc:ViewBilling"));
}
+
+ @Test
+ void hasPermissionReturnsTrueForIssuerPagoPA() {
+ Authentication authentication = mock(Authentication.class);
+ SelfCareUser user = SelfCareUser.builder("userId").issuer("PAGOPA").build();
+
+ when(authentication.getPrincipal()).thenReturn(user);
+
+ assertTrue(permissionEvaluator.hasPermission(authentication, new FilterAuthorityDomain("institutionId", null, null), "Selc:ViewInstitutionData"));
+ }
+
+ @Test
+ void hasPermissionReturnsFalseForIssuerPagoPA() {
+ Authentication authentication = mock(Authentication.class);
+ SelfCareUser user = SelfCareUser.builder("userId").issuer("PAGOPA").build();
+
+ when(authentication.getPrincipal()).thenReturn(user);
+
+ assertFalse(permissionEvaluator.hasPermission(authentication, new FilterAuthorityDomain("institutionId", null, null), "Selc:ViewBilling"));
+ }
}