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_ACCOUNTS_SERVICE_AUTHORIZATION_SERVICE_HPP
21#define ORES_ACCOUNTS_SERVICE_AUTHORIZATION_SERVICE_HPP
22
23#include <string>
24#include <vector>
25#include <optional>
26#include <boost/uuid/uuid.hpp>
27#include "ores.utility/log/make_logger.hpp"
28#include "ores.utility/uuid/uuid_v7_generator.hpp"
29#include "ores.database/domain/context.hpp"
30#include "ores.accounts/domain/role.hpp"
31#include "ores.accounts/domain/permission.hpp"
32#include "ores.accounts/domain/account_role.hpp"
33#include "ores.accounts/repository/role_repository.hpp"
34#include "ores.accounts/repository/permission_repository.hpp"
35#include "ores.accounts/repository/account_role_repository.hpp"
36#include "ores.accounts/repository/role_permission_repository.hpp"
37#include "ores.eventing/service/event_bus.hpp"
38
39namespace ores::accounts::service {
40
55private:
56 inline static std::string_view logger_name =
57 "ores.accounts.service.authorization_service";
58
59 [[nodiscard]] static auto& lg() {
60 using namespace ores::utility::log;
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
156 void assign_role(const boost::uuids::uuid& account_id,
157 const boost::uuids::uuid& role_id,
158 const std::string& assigned_by);
159
169 void revoke_role(const boost::uuids::uuid& account_id,
170 const boost::uuids::uuid& role_id);
171
175 std::vector<domain::role>
176 get_account_roles(const boost::uuids::uuid& account_id);
177
178 // ========================================================================
179 // Permission Checking
180 // ========================================================================
181
190 std::vector<std::string>
191 get_effective_permissions(const boost::uuids::uuid& account_id);
192
202 bool has_permission(const boost::uuids::uuid& account_id,
203 const std::string& permission_code);
204
214 static bool check_permission(const std::vector<std::string>& permissions,
215 const std::string& required_permission);
216
217private:
221 void publish_permissions_changed(const boost::uuids::uuid& account_id);
222
223 repository::permission_repository permission_repo_;
225 repository::account_role_repository account_role_repo_;
226 repository::role_permission_repository role_permission_repo_;
227 utility::uuid::uuid_v7_generator uuid_generator_;
228 event_bus* event_bus_;
229};
230
231}
232
233#endif
Implements logging for ORE Studio.
Definition lifecycle_manager.hpp:30
Represents an atomic permission that can be granted to roles.
Definition permission.hpp:35
Represents a named collection of permissions that can be assigned to accounts.
Definition role.hpp:38
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:294
std::optional< domain::role > find_role(const boost::uuids::uuid &role_id)
Finds a role by its ID.
Definition authorization_service.cpp:114
std::optional< domain::permission > find_permission_by_code(const std::string &code)
Finds a permission by its code.
Definition authorization_service.cpp:54
std::optional< domain::role > find_role_by_name(const std::string &name)
Finds a role by its name.
Definition authorization_service.cpp:126
std::vector< domain::permission > list_permissions()
Lists all permissions in the system.
Definition authorization_service.cpp:48
domain::permission create_permission(const std::string &code, const std::string &description)
Creates a new permission.
Definition authorization_service.cpp:63
void assign_role(const boost::uuids::uuid &account_id, const boost::uuids::uuid &role_id, const std::string &assigned_by)
Assigns a role to an account.
Definition authorization_service.cpp:213
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:137
std::vector< domain::role > get_account_roles(const boost::uuids::uuid &account_id)
Gets all roles assigned to an account.
Definition authorization_service.cpp:282
std::vector< domain::role > list_roles()
Lists all roles in the system.
Definition authorization_service.cpp:95
bool has_permission(const boost::uuids::uuid &account_id, const std::string &permission_code)
Checks if an account has a specific permission.
Definition authorization_service.cpp:307
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:258
static bool check_permission(const std::vector< std::string > &permissions, const std::string &required_permission)
Checks if the given permissions list satisfies a permission check.
Definition authorization_service.cpp:314
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:192
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
A generator for UUID version 7 (v7) based on RFC 9562.
Definition uuid_v7_generator.hpp:50