Overview
The Authorization Service implements a comprehensive Role-Based Access Control (RBAC) system that provides fine-grained access management through a hierarchical model:RBAC Entities
Users
Users are the core entity representing individuals who can authenticate and access the system. Domain Model:UserDomain (auth/domain/model/user/UserDomain.java:14)
- Uses Value Objects (
UserId,UserEmail) for type safety - Enforces business rules (can’t assign duplicate roles)
- Immutable user ID
- Rich account status tracking
- Inbound:
UserUseCasePort(auth/domain/port/in/UserUseCasePort.java:13) - Use cases - Outbound:
UserRepositoryPort(auth/domain/port/out/UserRepositoryPort.java:13) - Persistence
Roles
Roles group permissions and are assigned to users. Domain Model:RoleDomain (auth/domain/model/role/RoleDomain.java:14)
ADMIN- Full system accessMANAGER- Manage users and view reportsOPERATOR- Execute operationsVIEWER- Read-only access
Permissions
Permissions represent specific actions or capabilities. Domain Model:PermissionDomain
{ACTION}_{RESOURCE}format- Examples:
READ_USERS,WRITE_USERS,DELETE_ROLES,EXECUTE_REPORTS
Modules
Modules organize permissions by functional area or feature. Domain Model:ModuleDomain
Users- User management permissionsRoles- Role management permissionsAudit- Audit log permissionsReports- Reporting permissions
Entity Relationships
How RBAC Works
1. User Gets Roles
Roles are assigned to users through theUserUseCasePort:
2. Roles Contain Permissions
When a role is assigned permissions, the domain model enforces rules:3. Permissions Are Checked
Permissions are embedded in the JWT token during login:4. Access Control Enforcement
Permissions are enforced using Spring Security annotations:Permission Aggregation
If a user has multiple roles with overlapping permissions, they are aggregated (union): Example:Domain-Driven Design
The RBAC implementation follows DDD principles:Aggregates
User Aggregate:- Root:
UserDomain - Entities:
RoleDomain(referenced by ID in persistence) - Value Objects:
UserId,UserEmail,UserNames,UserPassword
- Root:
RoleDomain - Entities:
PermissionDomain(referenced by ID in persistence) - Value Objects:
RoleId,RoleName,RoleDescription
Invariants Enforced
- No duplicate roles per user (auth/domain/model/user/UserDomain.java:85-95):
- No duplicate permissions per role (auth/domain/model/role/RoleDomain.java:52-64):
- Email uniqueness - Enforced at repository level
- Required fields - Validated by value objects:
Repository Adapters
The persistence layer implements the repository ports: User Repository (auth/adapter/out/jpa/UserRepositoryAdapter.java:27):Use Cases
Create User with Role
Create Role with Permissions
Check User Permissions
Permissions are automatically checked via Spring Security:Status Management
All entities support status management:AccountStatus:
enabled- Can log inaccountNonExpired- Account not expiredaccountNonLocked- Not locked outcredentialsNonExpired- Password not expired
Searching and Filtering
The RBAC system supports advanced search (auth/domain/port/out/UserRepositoryPort.java:20):Best Practices
Principle of Least Privilege
Grant users only the minimum permissions needed for their tasks
Role Hierarchy
Design roles hierarchically: VIEWER → OPERATOR → MANAGER → ADMIN
Module Organization
Group related permissions into modules for easier management
Audit Changes
Track all role and permission changes using the audit system
Next Steps
User Management API
Explore user management endpoints
Role Management API
Explore role management endpoints
Authentication
Learn how JWT tokens include permissions
Audit Logging
See how RBAC changes are audited