Repository navigation
feat(core): Global RBAC Initial commit - #158
Conversation
Code coverage overviewLanguages: Java Java / code-coverage/jacoco
View coverage of the 10 most impacted files.
ℹ️ Calculations represent line coverage. Results may change as calculations are updated. Updated |
There was a problem hiding this comment.
Copilot review overview
🟡 Changes recommended
Unresolved authorization bypasses can grant service accounts unintended privileges, including platform-admin access.
Review effort: Balanced
Findings: 3
Open (7)
Service name claim alone grants service-account write privileges · New Service account can self-promote via ingestion mapping and connector updates · New Protected principal template creation bypasses authorization · New Missing identifier claim causes server error instead of 401 · New Authorization denials omit standard API error response fields · New Mock authentication fails when configured identifier claim differs · New Local profile overrides environment-configured identifier claim · New
What changed in this PR
Introduces Phase 1 global authorization for IDP-Core’s catalog APIs, replacing permissive baseline access with principal-based policies.
Changes:
- Adds authorization policies, controller resource metadata, and security-chain enforcement.
- Configures human identifiers and provisions principals without admin privileges.
- Updates security tests, integration fixtures, and authentication documentation.
| File | Description |
|---|---|
src/test/resources/db/test/R__6_insert_principal_user_for_test.sql |
Adds principal fixtures for authorization tests. |
src/test/resources/db/test/R__1_Insert_test_data.sql |
Adds an optional access-gate property. |
src/test/resources/application-test.yml |
Removes wildcard baseline configuration. |
src/test/java/com/decathlon/idp_core/SecurityConfigurationTest.java |
Checks removal of universal authority. |
src/test/java/com/decathlon/idp_core/infrastructure/adapters/api/handler/ApiExceptionHandlerTest.java |
Tests authorization exception mapping. |
src/test/java/com/decathlon/idp_core/infrastructure/adapters/api/controller/PrincipalControllerTest.java |
Tests standard human read access. |
src/test/java/com/decathlon/idp_core/infrastructure/adapters/api/controller/InboundWebhookManagementControllerTest.java |
Tests denied human webhook creation. |
src/test/java/com/decathlon/idp_core/infrastructure/adapters/api/controller/EntityTemplateControllerTest.java |
Seeds authorized principals for integration tests. |
src/test/java/com/decathlon/idp_core/infrastructure/adapters/api/controller/EntityDynamicMappingControllerTest.java |
Adds principal fixtures and adjusts payload escaping. |
src/test/java/com/decathlon/idp_core/infrastructure/adapters/api/controller/AuditControllerTest.java |
Uses admin principals for lifecycle tests. |
src/test/java/com/decathlon/idp_core/infrastructure/adapters/api/configuration/SecurityRolePropertiesTest.java |
Deletes obsolete baseline-role tests. |
src/test/java/com/decathlon/idp_core/infrastructure/adapters/api/configuration/security/chains/PublicFilterChainConfigTest.java |
Updates authentication configuration construction. |
src/test/java/com/decathlon/idp_core/infrastructure/adapters/api/configuration/security/chains/OAuth2LoginFilterChainConfigTest.java |
Checks authorization filter placement. |
src/test/java/com/decathlon/idp_core/infrastructure/adapters/api/configuration/security/chains/MockFilterChainConfigTest.java |
Checks mock-chain authorization wiring. |
src/test/java/com/decathlon/idp_core/infrastructure/adapters/api/configuration/security/chains/JwtFilterChainConfigTest.java |
Checks JWT-chain authorization wiring. |
src/test/java/com/decathlon/idp_core/infrastructure/adapters/api/configuration/AuthorizationConfigurationTest.java |
Tests policy binding and filter registration. |
src/test/java/com/decathlon/idp_core/infrastructure/adapters/api/configuration/AuthenticationPropertiesTest.java |
Tests identifier-claim configuration. |
src/test/java/com/decathlon/idp_core/infrastructure/adapters/api/auth/UnifiedUserProviderTest.java |
Tests shared identity extraction. |
src/test/java/com/decathlon/idp_core/infrastructure/adapters/api/auth/TestHandlerMappings.java |
Supplies controller mappings for authorization tests. |
src/test/java/com/decathlon/idp_core/infrastructure/adapters/api/auth/JitProvisioningFilterTest.java |
Checks request-scoped principal sharing. |
src/test/java/com/decathlon/idp_core/infrastructure/adapters/api/auth/GlobalAuthorizationFilterTest.java |
Tests authorization filtering and denial behavior. |
src/test/java/com/decathlon/idp_core/infrastructure/adapters/api/auth/AuthorizationRequestFactoryTest.java |
Tests route-derived actions and resources. |
src/test/java/com/decathlon/idp_core/domain/service/principal/PrincipalProvisioningServiceTest.java |
Checks non-admin provisioning defaults. |
src/test/java/com/decathlon/idp_core/domain/service/principal/PrincipalExtractorTest.java |
Tests configured human identifier extraction. |
src/test/java/com/decathlon/idp_core/domain/service/authorization/GlobalAuthorizationServiceTest.java |
Tests the global authorization matrix. |
src/main/resources/application.yml |
Adds authorization and identifier settings. |
src/main/resources/application-local.yml |
Selects GitHub’s identifier claim locally. |
src/main/java/com/decathlon/idp_core/infrastructure/adapters/api/principal/strategies/OAuth2UserPrincipalExtractionStrategy.java |
Uses configured OAuth2/OIDC identifiers. |
src/main/java/com/decathlon/idp_core/infrastructure/adapters/api/principal/strategies/JwtPrincipalExtractionStrategy.java |
Uses configured human JWT identifiers. |
src/main/java/com/decathlon/idp_core/infrastructure/adapters/api/handler/ApiExceptionHandler.java |
Maps authorization exceptions to 403. |
src/main/java/com/decathlon/idp_core/infrastructure/adapters/api/controller/PrincipalController.java |
Declares the principal resource. |
src/main/java/com/decathlon/idp_core/infrastructure/adapters/api/controller/InboundWebhookConfigurationController.java |
Declares webhook configuration resources. |
src/main/java/com/decathlon/idp_core/infrastructure/adapters/api/controller/EntityTemplateController.java |
Declares template resources. |
src/main/java/com/decathlon/idp_core/infrastructure/adapters/api/controller/EntityGraphController.java |
Declares entity graph resources. |
src/main/java/com/decathlon/idp_core/infrastructure/adapters/api/controller/EntityDynamicMappingController.java |
Marks mapping resources and read-only dry runs. |
src/main/java/com/decathlon/idp_core/infrastructure/adapters/api/controller/EntityController.java |
Marks entity resources and read-only searches. |
src/main/java/com/decathlon/idp_core/infrastructure/adapters/api/controller/AuditController.java |
Declares audit resources. |
src/main/java/com/decathlon/idp_core/infrastructure/adapters/api/configuration/SecurityRoleProperties.java |
Deletes baseline-role configuration. |
src/main/java/com/decathlon/idp_core/infrastructure/adapters/api/configuration/SecurityConfiguration.java |
Removes wildcard authority assignment. |
src/main/java/com/decathlon/idp_core/infrastructure/adapters/api/configuration/security/chains/OAuth2LoginFilterChainConfig.java |
Enforces authorization after provisioning. |
src/main/java/com/decathlon/idp_core/infrastructure/adapters/api/configuration/security/chains/MockFilterChainConfig.java |
Adds mock-chain authorization enforcement. |
src/main/java/com/decathlon/idp_core/infrastructure/adapters/api/configuration/security/chains/JwtFilterChainConfig.java |
Adds JWT-chain authorization enforcement. |
src/main/java/com/decathlon/idp_core/infrastructure/adapters/api/configuration/AuthorizationProperties.java |
Binds external authorization settings. |
src/main/java/com/decathlon/idp_core/infrastructure/adapters/api/configuration/AuthorizationConfiguration.java |
Builds the domain policy and controls registration. |
src/main/java/com/decathlon/idp_core/infrastructure/adapters/api/configuration/AuthenticationProperties.java |
Adds the human identifier-claim setting. |
src/main/java/com/decathlon/idp_core/infrastructure/adapters/api/auth/UnifiedUserProvider.java |
Aligns audit identities with principal extraction. |
src/main/java/com/decathlon/idp_core/infrastructure/adapters/api/auth/ProvisionedPrincipalContext.java |
Shares provisioned principals within requests. |
src/main/java/com/decathlon/idp_core/infrastructure/adapters/api/auth/JitProvisioningFilter.java |
Exposes provisioning results to authorization. |
src/main/java/com/decathlon/idp_core/infrastructure/adapters/api/auth/GlobalAuthorizationFilter.java |
Enforces the global policy on authenticated requests. |
src/main/java/com/decathlon/idp_core/infrastructure/adapters/api/auth/AuthorizedResource.java |
Defines controller resource metadata. |
src/main/java/com/decathlon/idp_core/infrastructure/adapters/api/auth/AuthorizationRequestFactory.java |
Derives authorization context from MVC mappings. |
src/main/java/com/decathlon/idp_core/domain/service/principal/PrincipalProvisioningService.java |
Defaults new principals to non-admin. |
src/main/java/com/decathlon/idp_core/domain/service/authorization/GlobalAuthorizationService.java |
Implements global access decisions. |
src/main/java/com/decathlon/idp_core/domain/model/authorization/AuthorizationResource.java |
Models resource identifiers and parent context. |
src/main/java/com/decathlon/idp_core/domain/model/authorization/AuthorizationRequest.java |
Models principal, action, and resource input. |
src/main/java/com/decathlon/idp_core/domain/model/authorization/AuthorizationPolicy.java |
Stores immutable authorization policy settings. |
src/main/java/com/decathlon/idp_core/domain/model/authorization/AuthorizationMode.java |
Defines current and future policy modes. |
src/main/java/com/decathlon/idp_core/domain/model/authorization/AuthorizationAction.java |
Defines supported authorization actions. |
src/main/java/com/decathlon/idp_core/domain/exception/authorization/PrincipalNotAuthorizedException.java |
Represents denied domain operations. |
docs/src/concepts/authentication.md |
Documents global policies and identifier configuration. |
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
There was a problem hiding this comment.
Copilot review overview
🟡 Changes recommended
Service accounts can still alter or delete protected principal-ingestion configuration.
Review effort: Balanced
Findings: 4
Open (5)
Authorize resolved target before deleting mappings or webhooks · New Authorize stored mapping target before replacing principal mapping · New Protected principal template creation bypasses authorization Service name claim alone grants service-account write privileges GitHub OAuth uses incorrect default principal identifier claim · New
Resolved since last review (5)
Service account can self-promote via ingestion mapping and connector updates Local profile overrides environment-configured identifier claim Mock authentication fails when configured identifier claim differs Authorization denials omit standard API error response fields Missing identifier claim causes server error instead of 401
There was a problem hiding this comment.
Copilot review overview
🟡 Changes recommended
An unresolved authorization bypass lets service accounts disable protected principal-ingestion connectors.
Review effort: Balanced
Findings: 1
Open (1)
Resolved since last review (5)
Authorize stored mapping target before replacing principal mapping Authorize resolved target before deleting mappings or webhooks Protected principal template creation bypasses authorization Service name claim alone grants service-account write privileges GitHub OAuth uses incorrect default principal identifier claim
|





PR Description
What this PR Provides
This pull request introduces a comprehensive authorization model for the IDP-Core platform, focusing on a
principalentity template and enforcing stricter access control for sensitive operations. It adds new domain models for authorization, a global authorization service, and updates to principal provisioning logic. Additionally, documentation is updated to reflect these security enhancements and constraints.GLOBALauthorization to the JWT, OAuth2 login, and mock API security chains.principalentity hasis_admin: true.truefor access to protected API endpoints, including reads. When unset, the gate is disabled.is_adminand the configured human-access property.Authorization Model and Enforcement:
AuthorizationAction,AuthorizationMode,AuthorizationPolicy,AuthorizationRequest, andAuthorizationResource, to standardize how authorization is described and enforced in the domain layer. [1] [2] [3] [4] [5]GlobalAuthorizationServiceto enforce global authorization policies, including catalog administrator checks, break-glass bypass, and property-based access control, throwingPrincipalNotAuthorizedExceptionon violations. [1] [2]Principal Entity Protection and Provisioning:
PrincipalProvisioningServiceto support provisioning global administrator principals, ensure correct property assignment (kind,is_admin), and only return principals matching the authenticated actor's kind.Validation and Error Handling:
ValidationMessages. [1] [2]Documentation Updates:
principaltemplate and mappings targeting it, and clarified the security rationale. [1] [2]Audit Identity Provider Port:
AuditIdentityProviderPortinterface to provide authenticated identity information for audit revisions.How to test
Initial state
principaltemplate with a Booleanis_adminproperty.Scenarios
Breaking changes
IDP_REQUIRED_PRINCIPAL_PROPERTYis set, humans need the named principal property set totrueto access protected API endpoints. When unset, this extra condition is disabled.is_adminproperty is not carried over automatically.IDP_SUPER_ADMIN_IDENTIFIER; deployments must provide values matching the resulting principal identifiers.