PACS System 0.1.0
PACS DICOM system library
Loading...
Searching...
No Matches
access_control_manager.h
Go to the documentation of this file.
1// BSD 3-Clause License
2// Copyright (c) 2021-2025, 🍀☀🌕🌥 🌊
3// See the LICENSE file in the project root for full license information.
4
14#pragma once
15
16#include "permission.h"
18#include "user.h"
19#include "user_context.h"
20#include <functional>
21#include <map>
22#include <memory>
23#include <mutex>
24#include <optional>
25#include <vector>
26
28
32enum class DicomOperation {
33 CStore,
34 CFind,
35 CMove,
36 CGet,
37 CEcho,
38 NCreate,
39 NSet,
40 NGet,
41 NDelete,
42 NAction,
44};
45
50 bool allowed{false};
51 std::string reason;
52
53 static AccessCheckResult allow() { return {true, ""}; }
54 static AccessCheckResult deny(std::string reason) {
55 return {false, std::move(reason)};
56 }
57
58 explicit operator bool() const { return allowed; }
59};
60
65 std::function<void(const user_context &ctx, DicomOperation op,
66 const AccessCheckResult &result)>;
67
72public:
74
75 // Permission Checks
76 [[nodiscard]] bool check_permission(const User &user, ResourceType resource,
77 std::uint32_t action_mask) const;
78 [[nodiscard]] bool has_role(const User &user, Role role) const;
79
87 [[nodiscard]] auto validate_access(const user_context &ctx,
89 std::uint32_t action_mask)
90 -> kcenon::common::VoidResult;
91
99 DicomOperation op) const;
100
107 [[nodiscard]] std::optional<user_context> get_context_for_ae(
108 std::string_view ae_title, const std::string &session_id) const;
109
110 // Configuration
111 void set_role_permissions(Role role, std::vector<Permission> permissions);
112 [[nodiscard]] const std::vector<Permission> &
113 get_role_permissions(Role role) const;
114
115 // Storage Integration
116 void set_storage(std::shared_ptr<security_storage_interface> storage);
117
118 // AE Title to User mapping
119 void register_ae_title(std::string_view ae_title, std::string_view user_id);
120 void unregister_ae_title(std::string_view ae_title);
121
122 // Audit callback
124
125 // User Management Facade
126 [[nodiscard]] auto create_user(const User &user)
127 -> kcenon::common::VoidResult;
128 [[nodiscard]] auto assign_role(std::string_view user_id, Role role)
129 -> kcenon::common::VoidResult;
130 [[nodiscard]] auto get_user(std::string_view id)
132
138 [[nodiscard]] auto get_user_by_ae_title(std::string_view ae_title)
139 -> std::optional<User>;
140
141private:
142 std::map<Role, std::vector<Permission>> role_permissions_;
143 std::shared_ptr<security_storage_interface> storage_;
144 std::map<std::string, std::string> ae_to_user_id_;
146 mutable std::mutex mutex_;
147
149
153 static std::pair<ResourceType, std::uint32_t>
155};
156
157} // namespace kcenon::pacs::security
Manages permissions and access checks.
auto get_user_by_ae_title(std::string_view ae_title) -> std::optional< User >
Get user by AE Title.
auto create_user(const User &user) -> kcenon::common::VoidResult
bool has_role(const User &user, Role role) const
bool check_permission(const User &user, ResourceType resource, std::uint32_t action_mask) const
static std::pair< ResourceType, std::uint32_t > map_dicom_operation(DicomOperation op)
Map DICOM operation to resource type and action.
AccessCheckResult check_dicom_operation(const user_context &ctx, DicomOperation op) const
Check if a DICOM operation is allowed.
void set_role_permissions(Role role, std::vector< Permission > permissions)
std::map< Role, std::vector< Permission > > role_permissions_
auto get_user(std::string_view id) -> kcenon::common::Result< User >
void register_ae_title(std::string_view ae_title, std::string_view user_id)
void set_storage(std::shared_ptr< security_storage_interface > storage)
auto validate_access(const user_context &ctx, ResourceType resource, std::uint32_t action_mask) -> kcenon::common::VoidResult
Validate access for a user context.
const std::vector< Permission > & get_role_permissions(Role role) const
std::shared_ptr< security_storage_interface > storage_
void set_audit_callback(AccessAuditCallback callback)
std::map< std::string, std::string > ae_to_user_id_
auto assign_role(std::string_view user_id, Role role) -> kcenon::common::VoidResult
std::optional< user_context > get_context_for_ae(std::string_view ae_title, const std::string &session_id) const
Get user context for an AE Title.
Represents the security context for a user session.
Role
User roles in the PACS system.
Definition role.h:25
std::function< void(const user_context &ctx, DicomOperation op, const AccessCheckResult &result)> AccessAuditCallback
Callback for audit logging of access attempts.
ResourceType
Categories of resources requiring protection.
Definition permission.h:25
DicomOperation
DICOM operation types for permission checking.
Permission definitions for RBAC.
Storage interface for RBAC persistence.
static AccessCheckResult deny(std::string reason)
Represents a user in the system.
Definition user.h:26
User definition for RBAC.
User context for session-based access control.