MATIH Platform is in active MVP development. Documentation reflects current implementation status.
6. Identity & Access Management
Roles & Permissions
Permission Model

Permission Model

Production - Permission entity with resource:action pattern

Permissions in the MATIH platform follow the resource:action pattern, providing fine-grained access control. Each permission maps to a specific resource and action combination.


6.5.2Permission Structure

@Entity
@Table(name = "permissions")
public class Permission {
    private Long id;
    private String name;         // e.g., "users:read"
    private String resource;     // e.g., "users"
    private String action;       // e.g., "read"
    private String category;     // For UI grouping
    private boolean system;      // System permissions cannot be deleted
 
    // Factory methods
    public static Permission read(String resource, String description);
    public static Permission write(String resource, String description);
    public static Permission delete(String resource, String description);
    public static Permission admin(String resource, String description);
}

Common Actions

ActionDescription
readView/list resources
writeCreate/update resources
deleteRemove resources
adminFull administrative control
executeRun/trigger operations
manageManage configuration

Example Permissions

PermissionResourceActionDescription
users:readusersreadView user profiles
users:writeuserswriteCreate and update users
users:deleteusersdeleteDelete user accounts
users:impersonateusersimpersonateImpersonate other users
roles:readrolesreadView roles
roles:writeroleswriteManage roles
dashboards:readdashboardsreadView dashboards
dashboards:writedashboardswriteCreate dashboards
queries:executequeriesexecuteExecute data queries
pipelines:executepipelinesexecuteRun data pipelines
api_keys:readapi_keysreadView API keys
api_keys:adminapi_keysadminFull API key management
oauth2:clients:readoauth2:clientsreadView OAuth2 clients
oauth2:clients:writeoauth2:clientswriteManage OAuth2 clients
mfa:resetmfaresetAdmin MFA reset
audit:readauditreadView audit logs
system:cache:readsystem:cachereadView cache stats
system:cache:writesystem:cachewriteManage caches

6.5.3Permission Resolution

User permissions are resolved by collecting all permissions from all assigned roles, including inherited permissions from parent roles:

// User.getAllPermissionNames()
public Set<String> getAllPermissionNames() {
    return roles.stream()
        .flatMap(role -> role.getPermissions().stream())
        .map(permission -> permission.getName())
        .collect(Collectors.toSet());
}
 
// User.getAuthorities() for Spring Security
public Set<String> getAuthorities() {
    Set<String> authorities = new HashSet<>();
    roles.forEach(role -> {
        authorities.add("ROLE_" + role.getName().toUpperCase().replace('-', '_'));
        role.getPermissions().forEach(permission ->
            authorities.add(permission.getName())
        );
    });
    return authorities;
}

Spring Security Integration

Permissions are used in two ways in controller methods:

// Role-based check
@PreAuthorize("hasAnyRole('ADMIN', 'PLATFORM_ADMIN')")
 
// Permission-based check
@PreAuthorize("hasAuthority('users:impersonate') or hasRole('ADMIN')")
 
// Custom permission evaluator
@PreAuthorize("hasPermission('mfa-policy', 'create')")