diff --git a/src/main/java/de/ozgcloud/admin/OzgCloudRestLinksConfiguration.java b/src/main/java/de/ozgcloud/admin/OzgCloudRestLinksConfiguration.java index aed42f066ab050bc9408f331073a85039b644345..5bf4c55db0af6b7785b80fac20e6c047a4f264c4 100644 --- a/src/main/java/de/ozgcloud/admin/OzgCloudRestLinksConfiguration.java +++ b/src/main/java/de/ozgcloud/admin/OzgCloudRestLinksConfiguration.java @@ -65,7 +65,6 @@ class OzgCloudRestLinksConfiguration { class OzgCloudDelegatingRepositoryResourceMappings extends RepositoryResourceMappings { private final Repositories repositories; - private final SecuredAuthorizationManager authManager = new SecuredAuthorizationManager(); public OzgCloudDelegatingRepositoryResourceMappings(Repositories repositories, PersistentEntities entities, RepositoryRestConfiguration configuration) { @@ -80,9 +79,11 @@ class OzgCloudDelegatingRepositoryResourceMappings extends RepositoryResourceMap } @RequiredArgsConstructor - class OzgCloudDelegatingResourceMetadata implements ResourceMetadata { + static class OzgCloudDelegatingResourceMetadata implements ResourceMetadata { + private final ResourceMetadata metadata; private final Repositories repositories; + private final SecuredAuthorizationManager authManager = new SecuredAuthorizationManager(); @Override public LinkRelation getItemResourceRel() { @@ -108,7 +109,7 @@ class OzgCloudDelegatingRepositoryResourceMappings extends RepositoryResourceMap var repository = repositories.getRepositoryFor(type); return repository.map(repo -> authManager.check(() -> SecurityContextHolder.getContext().getAuthentication(), getFindAllInvocation(repo))) .map(AuthorizationDecision::isGranted) - .orElse(false); + .orElse(true); } MethodInvocation getFindAllInvocation(Object repository) { diff --git a/src/test/java/de/ozgcloud/admin/OzgCloudDelegatingResourceMetadataTest.java b/src/test/java/de/ozgcloud/admin/OzgCloudDelegatingResourceMetadataTest.java new file mode 100644 index 0000000000000000000000000000000000000000..149b600f9dd83e9bb2bb3b1e0488ef72c143e9fa --- /dev/null +++ b/src/test/java/de/ozgcloud/admin/OzgCloudDelegatingResourceMetadataTest.java @@ -0,0 +1,132 @@ +package de.ozgcloud.admin; + +import static org.assertj.core.api.Assertions.*; +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.Mockito.*; + +import java.util.Optional; + +import org.aopalliance.intercept.MethodInvocation; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.Spy; +import org.springframework.data.repository.support.Repositories; +import org.springframework.data.rest.core.mapping.ResourceMetadata; +import org.springframework.security.authorization.AuthorizationDecision; +import org.springframework.security.authorization.method.SecuredAuthorizationManager; + +import de.ozgcloud.admin.OzgCloudDelegatingRepositoryResourceMappings.OzgCloudDelegatingResourceMetadata; +import de.ozgcloud.common.test.ReflectionTestUtils; + +class OzgCloudDelegatingResourceMetadataTest { + + @Spy + @InjectMocks + private OzgCloudDelegatingResourceMetadata delegatingResourceMetadata; + + @Mock + private ResourceMetadata metadata; + @Mock + private Repositories repositories; + @Mock + private SecuredAuthorizationManager authManager; + + @Nested + class TestIsExported { + + void initDefaults() { + doReturn(true).when(delegatingResourceMetadata).isAccessPermitted(any()); + } + + @Test + void shouldReturnTrue() { + when(metadata.isExported()).thenReturn(true); + doReturn(true).when(delegatingResourceMetadata).isAccessPermitted(any()); + + var result = delegatingResourceMetadata.isExported(); + + assertThat(result).isTrue(); + } + + @Test + void shouldReturnFalseIfNotPermitted() { + doReturn(false).when(delegatingResourceMetadata).isAccessPermitted(any()); + + var result = delegatingResourceMetadata.isExported(); + + assertThat(result).isFalse(); + } + + @Test + void shouldReturnFalseIfNotExported() { + doReturn(true).when(delegatingResourceMetadata).isAccessPermitted(any()); + when(metadata.isExported()).thenReturn(false); + + var result = delegatingResourceMetadata.isExported(); + + assertThat(result).isFalse(); + } + } + + @Nested + class TestIsAccessPermitted { + @Mock + private Object repository; + @Mock + private AuthorizationDecision decision; + + @BeforeEach + void initMock() { + when(repositories.getRepositoryFor(any())).thenReturn(Optional.of(repository)); + + doReturn(Mockito.mock(MethodInvocation.class)).when(delegatingResourceMetadata).getFindAllInvocation(any()); + } + + @BeforeEach + void mockAuthManager() { + when(authManager.check(any(), any())).thenReturn(decision); + + ReflectionTestUtils.setField(delegatingResourceMetadata, "authManager", authManager); + } + + @Test + void shouldReturnTrueIfGranted() { + when(decision.isGranted()).thenReturn(true); + + var result = delegatingResourceMetadata.isAccessPermitted(any()); + + assertThat(result).isTrue(); + } + + @Test + void shouldReturnFalseIfNotGranted() { + when(decision.isGranted()).thenReturn(false); + + var result = delegatingResourceMetadata.isAccessPermitted(any()); + + assertThat(result).isFalse(); + } + + @Test + void shouldReturnTrueIfNotSecured() { + when(authManager.check(any(), any())).thenReturn(null); + + var result = delegatingResourceMetadata.isAccessPermitted(any()); + + assertThat(result).isTrue(); + } + } + + @Nested + class TestGetFindAllInvocation { + @Test + void shouldReturnMethod() { + + } + } + +} diff --git a/src/test/java/de/ozgcloud/admin/reporting/ReportingSettingRepositoryITCase.java b/src/test/java/de/ozgcloud/admin/reporting/ReportingSettingRepositoryITCase.java index 226731aca5766dd214c2ff2b0d4d67ba9a1a071b..1b47da2c89b1828ddadeb480759f70efce9a4b9d 100644 --- a/src/test/java/de/ozgcloud/admin/reporting/ReportingSettingRepositoryITCase.java +++ b/src/test/java/de/ozgcloud/admin/reporting/ReportingSettingRepositoryITCase.java @@ -29,7 +29,9 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.mongodb.core.MongoOperations; +import org.springframework.security.test.context.support.WithMockUser; +import de.ozgcloud.admin.common.user.UserRole; import de.ozgcloud.admin.setting.SettingTestFactory; import de.ozgcloud.common.test.DataITCase; @@ -48,6 +50,7 @@ class ReportingSettingRepositoryITCase { } @Test + @WithMockUser(roles = UserRole.DATENBEAUFTRAGUNG) void shouldLoadOnlyFieldMapping() { operations.save(AggregationMappingTestFactory.create()); operations.save(SettingTestFactory.create()); diff --git a/src/test/resources/application-itcase.yaml b/src/test/resources/application-itcase.yaml index 0770237228911d2284f4d2237c22c005037cb7eb..1361c8ede1a7c0664bb56cdd718ac67942899c4c 100644 --- a/src/test/resources/application-itcase.yaml +++ b/src/test/resources/application-itcase.yaml @@ -1,6 +1,7 @@ logging: level: '[org.springframework.data.mongodb]': WARN + '[org.springframework.security]': WARN config: classpath:log4j2-local.xml spring: