Add RBAC support with roles, permissions, and session management. Implement middleware for authentication and CSRF protection. Enhance audit logging with additional fields. Update HTTP handlers and routes for new features.
This commit is contained in:
@@ -4,7 +4,6 @@ import (
|
||||
"context"
|
||||
"errors"
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
"github.com/example/storage-appliance/internal/audit"
|
||||
"github.com/example/storage-appliance/internal/domain"
|
||||
@@ -49,6 +48,7 @@ func (s *StorageService) CreatePool(ctx context.Context, user string, role strin
|
||||
}
|
||||
// Create a job to build a pool. For skeleton, we just create a job entry with type create-pool
|
||||
j := domain.Job{Type: "create-pool", Status: "queued", Owner: domain.UUID(user)}
|
||||
j.Details = map[string]any{"name": name, "vdevs": vdevs}
|
||||
id, err := s.JobRunner.Enqueue(ctx, j)
|
||||
// Store details in audit
|
||||
if s.Audit != nil {
|
||||
@@ -64,6 +64,7 @@ func (s *StorageService) Snapshot(ctx context.Context, user, role, dataset, snap
|
||||
}
|
||||
// call zfs snapshot, but do as job; enqueue
|
||||
j := domain.Job{Type: "snapshot", Status: "queued", Owner: domain.UUID(user)}
|
||||
j.Details = map[string]any{"dataset": dataset, "snap_name": snapName}
|
||||
id, err := s.JobRunner.Enqueue(ctx, j)
|
||||
if s.Audit != nil {
|
||||
s.Audit.Record(ctx, audit.Event{UserID: user, Action: "dataset.snapshot.request", ResourceType: "snapshot", ResourceID: fmt.Sprintf("%s@%s", dataset, snapName), Success: err == nil, Details: map[string]any{"dataset": dataset}})
|
||||
@@ -76,6 +77,7 @@ func (s *StorageService) ScrubStart(ctx context.Context, user, role, pool string
|
||||
return "", ErrForbidden
|
||||
}
|
||||
j := domain.Job{Type: "scrub", Status: "queued", Owner: domain.UUID(user)}
|
||||
j.Details = map[string]any{"pool": pool}
|
||||
id, err := s.JobRunner.Enqueue(ctx, j)
|
||||
if s.Audit != nil {
|
||||
s.Audit.Record(ctx, audit.Event{UserID: user, Action: "pool.scrub.request", ResourceType: "pool", ResourceID: pool, Success: err == nil})
|
||||
@@ -93,7 +95,11 @@ func (s *StorageService) CreateDataset(ctx context.Context, user, role, name str
|
||||
if role != "admin" && role != "operator" {
|
||||
return ErrForbidden
|
||||
}
|
||||
return s.ZFS.CreateDataset(ctx, name, props)
|
||||
err := s.ZFS.CreateDataset(ctx, name, props)
|
||||
if s.Audit != nil {
|
||||
s.Audit.Record(ctx, audit.Event{UserID: user, Action: "dataset.create", ResourceType: "dataset", ResourceID: name, Success: err == nil, Details: map[string]any{"props": props}})
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
// GetPoolStatus calls the adapter
|
||||
|
||||
Reference in New Issue
Block a user