Implement user caching to speed up PullPlan (#1109)
This commit is contained in:
parent
f0bac53e7b
commit
5bbed6ef9a
@ -95,12 +95,14 @@ std::unique_ptr<memgraph::query::FineGrainedAuthChecker> AuthChecker::GetFineGra
|
|||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
auto locked_auth = auth_->Lock();
|
auto locked_auth = auth_->Lock();
|
||||||
auto user = locked_auth->GetUser(username);
|
if (username != user_.username()) {
|
||||||
if (!user) {
|
auto maybe_user = locked_auth->GetUser(username);
|
||||||
|
if (!maybe_user) {
|
||||||
throw memgraph::query::QueryRuntimeException("User '{}' doesn't exist .", username);
|
throw memgraph::query::QueryRuntimeException("User '{}' doesn't exist .", username);
|
||||||
}
|
}
|
||||||
|
user_ = std::move(*maybe_user);
|
||||||
return std::make_unique<memgraph::glue::FineGrainedAuthChecker>(std::move(*user), dba);
|
}
|
||||||
|
return std::make_unique<memgraph::glue::FineGrainedAuthChecker>(user_, dba);
|
||||||
|
|
||||||
} catch (const memgraph::auth::AuthException &e) {
|
} catch (const memgraph::auth::AuthException &e) {
|
||||||
throw memgraph::query::QueryRuntimeException(e.what());
|
throw memgraph::query::QueryRuntimeException(e.what());
|
||||||
|
@ -39,6 +39,7 @@ class AuthChecker : public query::AuthChecker {
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
memgraph::utils::Synchronized<memgraph::auth::Auth, memgraph::utils::WritePrioritizedRWLock> *auth_;
|
memgraph::utils::Synchronized<memgraph::auth::Auth, memgraph::utils::WritePrioritizedRWLock> *auth_;
|
||||||
|
mutable auth::User user_;
|
||||||
};
|
};
|
||||||
#ifdef MG_ENTERPRISE
|
#ifdef MG_ENTERPRISE
|
||||||
class FineGrainedAuthChecker : public query::FineGrainedAuthChecker {
|
class FineGrainedAuthChecker : public query::FineGrainedAuthChecker {
|
||||||
|
@ -1221,6 +1221,8 @@ PullPlan::PullPlan(const std::shared_ptr<CachedPlan> plan, const Parameters &par
|
|||||||
ctx_.evaluation_context.labels = NamesToLabels(plan->ast_storage().labels_, dba);
|
ctx_.evaluation_context.labels = NamesToLabels(plan->ast_storage().labels_, dba);
|
||||||
#ifdef MG_ENTERPRISE
|
#ifdef MG_ENTERPRISE
|
||||||
if (license::global_license_checker.IsEnterpriseValidFast() && username.has_value() && dba) {
|
if (license::global_license_checker.IsEnterpriseValidFast() && username.has_value() && dba) {
|
||||||
|
// TODO How can we avoid creating this every time? If we must create it, it would be faster with an auth::User
|
||||||
|
// instead of the username
|
||||||
auto auth_checker = interpreter_context->auth_checker->GetFineGrainedAuthChecker(*username, dba);
|
auto auth_checker = interpreter_context->auth_checker->GetFineGrainedAuthChecker(*username, dba);
|
||||||
|
|
||||||
// if the user has global privileges to read, edit and write anything, we don't need to perform authorization
|
// if the user has global privileges to read, edit and write anything, we don't need to perform authorization
|
||||||
|
Loading…
Reference in New Issue
Block a user