16#include <initializer_list>
33 for (
const auto& r :
roles) {
34 if (r == role)
return true;
43 if (!user.has_value()) {
53 std::initializer_list<std::string> any_of) {
55 for (
const auto& role : any_of) {
58 throw AuthzError(
"authorization_denied: missing required role");
70 const std::string& action,
const std::string& resource_id,
71 std::optional<std::string> scope = std::nullopt) {
73 if (resource_id.empty()) {
75 throw std::invalid_argument(
"invalid_request: unresolved resource id");
93template <
typename Request>
95 const std::string& action,
96 const std::function<std::string(
const Request&)>& resolver,
97 const Request& request, std::optional<std::string> scope = std::nullopt) {
98 require_access(client, user, action, resolver(request), std::move(scope));
104template <
typename Request>
107 using Authenticator = std::function<std::optional<AxiamUser>(
const Request&)>;
112 auto user = auth_(request);
125#define AXIAM_REQUIRE_ACCESS(client, user, action, resource) \
126 ::axiam::require_access((client), (user), (action), (resource))
128#define AXIAM_REQUIRE_AUTH(user) ::axiam::require_auth((user))
Authentication failure: wrong credentials, expired session, MFA failure, or a 401 on the refresh call...
Definition errors.hpp:19
Authorization failure: authenticated but not permitted.
Definition errors.hpp:26
§10 guard functor: a callable that turns a request into an AxiamUser using a caller-supplied authenti...
Definition guard.hpp:105
AxiamUser operator()(const Request &request) const
Definition guard.hpp:111
std::function< std::optional< AxiamUser >(const Request &)> Authenticator
Definition guard.hpp:107
AxiamGuard(Authenticator auth)
Definition guard.hpp:109
AccessDecision check_access(const std::string &action, const std::string &resource_id, std::optional< std::string > scope=std::nullopt, std::optional< std::string > subject_id=std::nullopt)
Transport-level failure: connection refused, timeout, TLS error, DNS failure, malformed request (400)...
Definition errors.hpp:47
Definition authenticator.hpp:40
void require_access(Client &client, const std::optional< AxiamUser > &user, const std::string &action, const std::string &resource_id, std::optional< std::string > scope=std::nullopt)
§11 require_access — authorize the REQUEST's user (subject propagation: subject_id = user....
Definition guard.hpp:69
void require_role(const std::optional< AxiamUser > &user, std::initializer_list< std::string > any_of)
§11 require_role — local check against the verified token's roles.
Definition guard.hpp:52
const AxiamUser & require_auth(const std::optional< AxiamUser > &user)
§11 require_auth — endpoint requires an authenticated identity.
Definition guard.hpp:42
Result of an access check (CheckAccessResponse).
Definition types.hpp:86
bool allowed
Definition types.hpp:87
Authenticated identity injected by the §10 guard into the request context.
Definition guard.hpp:27
std::vector< std::string > roles
Definition guard.hpp:30
std::string tenant_id
Definition guard.hpp:29
bool has_role(const std::string &role) const
Definition guard.hpp:32
std::string user_id
Definition guard.hpp:28