ORE Studio 0.0.4
Loading...
Searching...
No Matches
authorization_service.hpp
1/* -*- mode: c++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
2 *
3 * Copyright (C) 2025 Marco Craveiro <marco.craveiro@gmail.com>
4 *
5 * This program is free software; you can redistribute it and/or modify it under
6 * the terms of the GNU General Public License as published by the Free Software
7 * Foundation; either version 3 of the License, or (at your option) any later
8 * version.
9 *
10 * This program is distributed in the hope that it will be useful, but WITHOUT
11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
12 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
13 * details.
14 *
15 * You should have received a copy of the GNU General Public License along with
16 * this program; if not, write to the Free Software Foundation, Inc., 51
17 * Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18 *
19 */
20#ifndef ORES_IAM_SERVICE_AUTHORIZATION_SERVICE_HPP
21#define ORES_IAM_SERVICE_AUTHORIZATION_SERVICE_HPP
22
23#include <string>
24#include <vector>
25#include <optional>
26#include <boost/uuid/uuid.hpp>
27#include "ores.logging/make_logger.hpp"
28#include "ores.utility/uuid/uuid_v7_generator.hpp"
29#include "ores.database/domain/context.hpp"
30#include "ores.iam/domain/role.hpp"
31#include "ores.iam/domain/permission.hpp"
32#include "ores.iam/domain/account_role.hpp"
33#include "ores.iam/repository/role_repository.hpp"
34#include "ores.iam/repository/permission_repository.hpp"
35#include "ores.iam/repository/account_role_repository.hpp"
36#include "ores.iam/repository/role_permission_repository.hpp"
37#include "ores.eventing/service/event_bus.hpp"
38
39namespace ores::iam::service {
40
55private:
56 inline static std::string_view logger_name =
57 "ores.iam.service.authorization_service";
58
59 [[nodiscard]] static auto& lg() {
60 using namespace ores::logging;
61 static auto instance = make_logger(logger_name);
62 return instance;
63 }
64
65public:
68
75 explicit authorization_service(context ctx,
76 event_bus* event_bus = nullptr);
77
78 // ========================================================================
79 // Permission Management
80 // ========================================================================
81
85 std::vector<domain::permission> list_permissions();
86
90 std::optional<domain::permission>
91 find_permission_by_code(const std::string& code);
92
100 domain::permission create_permission(const std::string& code,
101 const std::string& description);
102
103 // ========================================================================
104 // Role Management
105 // ========================================================================
106
110 std::vector<domain::role> list_roles();
111
115 std::optional<domain::role> find_role(const boost::uuids::uuid& role_id);
116
120 std::optional<domain::role> find_role_by_name(const std::string& name);
121
131 domain::role create_role(const std::string& name,
132 const std::string& description,
133 const std::vector<std::string>& permission_codes,
134 const std::string& recorded_by);
135
139 std::vector<std::string>
140 get_role_permissions(const boost::uuids::uuid& role_id);
141
142 // ========================================================================
143 // Role Assignment
144 // ========================================================================
145
157 void assign_role(const boost::uuids::uuid& account_id,
158 const boost::uuids::uuid& role_id,
159 const std::string& assigned_by,
160 const std::string& change_commentary = "Role assigned to account");
161
171 void revoke_role(const boost::uuids::uuid& account_id,
172 const boost::uuids::uuid& role_id);
173
177 std::vector<domain::role>
178 get_account_roles(const boost::uuids::uuid& account_id);
179
180 // ========================================================================
181 // Permission Checking
182 // ========================================================================
183
192 std::vector<std::string>
193 get_effective_permissions(const boost::uuids::uuid& account_id);
194
204 bool has_permission(const boost::uuids::uuid& account_id,
205 std::string_view permission_code);
206
216 static bool check_permission(const std::vector<std::string>& permissions,
217 std::string_view required_permission);
218
219private:
223 void publish_account_permissions_changed(const boost::uuids::uuid& account_id);
224
225 repository::permission_repository permission_repo_;
227 repository::account_role_repository account_role_repo_;
228 repository::role_permission_repository role_permission_repo_;
229 utility::uuid::uuid_v7_generator uuid_generator_;
230 event_bus* event_bus_;
231};
232
233}
234
235#endif
Service layer for the IAM module.
Definition account_service.hpp:34
Implements logging infrastructure for ORE Studio.
Definition boost_severity.hpp:28
Context for the operations on a postgres database.
Definition context.hpp:30
A typed, thread-safe, in-process publish/subscribe event bus.
Definition event_bus.hpp:119
Represents an atomic permission that can be granted to roles.
Definition permission.hpp:41
Represents a named collection of permissions that can be assigned to accounts.
Definition role.hpp:39
Reads and writes account-role assignments to data storage.
Definition account_role_repository.hpp:37
Reads and writes permissions to data storage.
Definition permission_repository.hpp:36
Reads and writes role-permission assignments to data storage.
Definition role_permission_repository.hpp:37
Reads and writes roles to data storage.
Definition role_repository.hpp:36
Service for managing role-based access control (RBAC).
Definition authorization_service.hpp:54
std::vector< std::string > get_effective_permissions(const boost::uuids::uuid &account_id)
Computes the effective permissions for an account.
Definition authorization_service.cpp:299
std::optional< domain::role > find_role(const boost::uuids::uuid &role_id)
Finds a role by its ID.
Definition authorization_service.cpp:116
bool has_permission(const boost::uuids::uuid &account_id, std::string_view permission_code)
Checks if an account has a specific permission.
Definition authorization_service.cpp:312
std::optional< domain::permission > find_permission_by_code(const std::string &code)
Finds a permission by its code.
Definition authorization_service.cpp:56
std::optional< domain::role > find_role_by_name(const std::string &name)
Finds a role by its name.
Definition authorization_service.cpp:128
std::vector< domain::permission > list_permissions()
Lists all permissions in the system.
Definition authorization_service.cpp:50
static bool check_permission(const std::vector< std::string > &permissions, std::string_view required_permission)
Checks if the given permissions list satisfies a permission check.
Definition authorization_service.cpp:319
domain::permission create_permission(const std::string &code, const std::string &description)
Creates a new permission.
Definition authorization_service.cpp:65
domain::role create_role(const std::string &name, const std::string &description, const std::vector< std::string > &permission_codes, const std::string &recorded_by)
Creates a new role with the specified permissions.
Definition authorization_service.cpp:139
std::vector< domain::role > get_account_roles(const boost::uuids::uuid &account_id)
Gets all roles assigned to an account.
Definition authorization_service.cpp:287
std::vector< domain::role > list_roles()
Lists all roles in the system.
Definition authorization_service.cpp:97
void assign_role(const boost::uuids::uuid &account_id, const boost::uuids::uuid &role_id, const std::string &assigned_by, const std::string &change_commentary="Role assigned to account")
Assigns a role to an account.
Definition authorization_service.cpp:215
void revoke_role(const boost::uuids::uuid &account_id, const boost::uuids::uuid &role_id)
Revokes a role from an account.
Definition authorization_service.cpp:263
std::vector< std::string > get_role_permissions(const boost::uuids::uuid &role_id)
Gets the permission codes assigned to a role.
Definition authorization_service.cpp:194
A generator for UUID version 7 (v7) based on RFC 9562.
Definition uuid_v7_generator.hpp:50