-
Notifications
You must be signed in to change notification settings - Fork 1.2k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
fix: fix user ERR NOAUTH Authentication required #2939
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -477,7 +477,11 @@ void Acl::UpdateDefaultUserPassword(const std::string& pass) { | |
if (pass.empty()) { | ||
u->SetUser("nopass"); | ||
} else { | ||
u->SetUser(">" + pass); | ||
if (g_pika_conf->userpass().empty()) { | ||
u->SetUser("nopass"); | ||
} else { | ||
u->SetUser(">" + pass); | ||
} | ||
} | ||
} | ||
|
||
|
@@ -489,27 +493,27 @@ void Acl::InitLimitUser(const std::string& bl, bool limit_exist) { | |
auto u = GetUser(DefaultLimitUser); | ||
if (limit_exist) { | ||
if (!bl.empty()) { | ||
for(auto& cmd : blacklist) { | ||
for (auto& cmd : blacklist) { | ||
cmd = pstd::StringTrim(cmd, " "); | ||
u->SetUser("-" + cmd); | ||
} | ||
u->SetUser("on"); | ||
} | ||
if (!pass.empty()) { | ||
u->SetUser(">"+pass); | ||
u->SetUser(">" + pass); | ||
} | ||
} else { | ||
if (pass.empty()) { | ||
u->SetUser("nopass"); | ||
} else { | ||
u->SetUser(">"+pass); | ||
u->SetUser(">" + pass); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 别的地方没啥问题, 就是这里和Acl::UpdateDefaultUserPassword这个函数里,要多次判断和设置密码 |
||
} | ||
u->SetUser("on"); | ||
u->SetUser("+@all"); | ||
u->SetUser("~*"); | ||
u->SetUser("&*"); | ||
|
||
for(auto& cmd : blacklist) { | ||
for (auto& cmd : blacklist) { | ||
cmd = pstd::StringTrim(cmd, " "); | ||
u->SetUser("-" + cmd); | ||
} | ||
|
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -30,8 +30,7 @@ PikaClientConn::PikaClientConn(int fd, const std::string& ip_port, net::Thread* | |||||||||||||||||||||||||
: RedisConn(fd, ip_port, thread, mpx, handle_type, max_conn_rbuf_size), | ||||||||||||||||||||||||||
server_thread_(reinterpret_cast<net::ServerThread*>(thread)), | ||||||||||||||||||||||||||
current_db_(g_pika_conf->default_db()) { | ||||||||||||||||||||||||||
// client init, set client user is default, and authenticated = false | ||||||||||||||||||||||||||
UnAuth(g_pika_server->Acl()->GetUserLock(Acl::DefaultUser)); | ||||||||||||||||||||||||||
InitUser(); | ||||||||||||||||||||||||||
time_stat_.reset(new TimeStat()); | ||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||
|
||||||||||||||||||||||||||
|
@@ -259,7 +258,7 @@ void PikaClientConn::ProcessMonitor(const PikaCmdArgsType& argv) { | |||||||||||||||||||||||||
} | ||||||||||||||||||||||||||
|
||||||||||||||||||||||||||
bool PikaClientConn::IsInterceptedByRTC(std::string& opt) { | ||||||||||||||||||||||||||
//currently we only Intercept: Get, HGet | ||||||||||||||||||||||||||
// currently we only Intercept: Get, HGet | ||||||||||||||||||||||||||
if (opt == kCmdNameGet && g_pika_conf->GetCacheString()) { | ||||||||||||||||||||||||||
return true; | ||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||
|
@@ -289,11 +288,9 @@ void PikaClientConn::ProcessRedisCmds(const std::vector<net::RedisCmdArgsType>& | |||||||||||||||||||||||||
bool is_slow_cmd = g_pika_conf->is_slow_cmd(opt); | ||||||||||||||||||||||||||
bool is_admin_cmd = g_pika_conf->is_admin_cmd(opt); | ||||||||||||||||||||||||||
|
||||||||||||||||||||||||||
//we don't intercept pipeline batch (argvs.size() > 1) | ||||||||||||||||||||||||||
if (g_pika_conf->rtc_cache_read_enabled() && | ||||||||||||||||||||||||||
argvs.size() == 1 && IsInterceptedByRTC(opt) && | ||||||||||||||||||||||||||
PIKA_CACHE_NONE != g_pika_conf->cache_mode() && | ||||||||||||||||||||||||||
!IsInTxn()) { | ||||||||||||||||||||||||||
// we don't intercept pipeline batch (argvs.size() > 1) | ||||||||||||||||||||||||||
if (g_pika_conf->rtc_cache_read_enabled() && argvs.size() == 1 && IsInterceptedByRTC(opt) && | ||||||||||||||||||||||||||
PIKA_CACHE_NONE != g_pika_conf->cache_mode() && !IsInTxn()) { | ||||||||||||||||||||||||||
Comment on lines
+291
to
+293
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Consider splitting complex condition for better readability. The multiple conditions could be split into separate checks with meaningful variable names for better maintainability. - if (g_pika_conf->rtc_cache_read_enabled() && argvs.size() == 1 && IsInterceptedByRTC(opt) &&
- PIKA_CACHE_NONE != g_pika_conf->cache_mode() && !IsInTxn()) {
+ bool is_cache_enabled = g_pika_conf->rtc_cache_read_enabled();
+ bool is_single_command = argvs.size() == 1;
+ bool is_cacheable_command = IsInterceptedByRTC(opt);
+ bool has_valid_cache_mode = PIKA_CACHE_NONE != g_pika_conf->cache_mode();
+ bool not_in_transaction = !IsInTxn();
+
+ if (is_cache_enabled && is_single_command && is_cacheable_command &&
+ has_valid_cache_mode && not_in_transaction) { 📝 Committable suggestion
Suggested change
|
||||||||||||||||||||||||||
// read in cache | ||||||||||||||||||||||||||
if (ReadCmdInCache(argvs[0], opt)) { | ||||||||||||||||||||||||||
delete arg; | ||||||||||||||||||||||||||
|
@@ -358,21 +355,17 @@ bool PikaClientConn::ReadCmdInCache(const net::RedisCmdArgsType& argv, const std | |||||||||||||||||||||||||
resp_num--; | ||||||||||||||||||||||||||
return false; | ||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||
//acl check | ||||||||||||||||||||||||||
// acl check | ||||||||||||||||||||||||||
int8_t subCmdIndex = -1; | ||||||||||||||||||||||||||
std::string errKey; | ||||||||||||||||||||||||||
auto checkRes = user_->CheckUserPermission(c_ptr, argv, subCmdIndex, &errKey); | ||||||||||||||||||||||||||
std::string object; | ||||||||||||||||||||||||||
if (checkRes == AclDeniedCmd::CMD || | ||||||||||||||||||||||||||
checkRes == AclDeniedCmd::KEY || | ||||||||||||||||||||||||||
checkRes == AclDeniedCmd::CHANNEL || | ||||||||||||||||||||||||||
checkRes == AclDeniedCmd::NO_SUB_CMD || | ||||||||||||||||||||||||||
checkRes == AclDeniedCmd::NO_AUTH | ||||||||||||||||||||||||||
) { | ||||||||||||||||||||||||||
//acl check failed | ||||||||||||||||||||||||||
if (checkRes == AclDeniedCmd::CMD || checkRes == AclDeniedCmd::KEY || checkRes == AclDeniedCmd::CHANNEL || | ||||||||||||||||||||||||||
checkRes == AclDeniedCmd::NO_SUB_CMD || checkRes == AclDeniedCmd::NO_AUTH) { | ||||||||||||||||||||||||||
// acl check failed | ||||||||||||||||||||||||||
return false; | ||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||
//only read command(Get, HGet) will reach here, no need of record lock | ||||||||||||||||||||||||||
// only read command(Get, HGet) will reach here, no need of record lock | ||||||||||||||||||||||||||
bool read_status = c_ptr->DoReadCommandInCache(); | ||||||||||||||||||||||||||
auto cmdstat_map = g_pika_cmd_table_manager->GetCommandStatMap(); | ||||||||||||||||||||||||||
resp_num--; | ||||||||||||||||||||||||||
|
@@ -547,13 +540,28 @@ void PikaClientConn::UnAuth(const std::shared_ptr<User>& user) { | |||||||||||||||||||||||||
} | ||||||||||||||||||||||||||
|
||||||||||||||||||||||||||
bool PikaClientConn::IsAuthed() const { return authenticated_; } | ||||||||||||||||||||||||||
|
||||||||||||||||||||||||||
void PikaClientConn::InitUser() { | ||||||||||||||||||||||||||
if (!g_pika_conf->GetUserBlackList().empty()) { | ||||||||||||||||||||||||||
user_ = g_pika_server->Acl()->GetUserLock(Acl::DefaultLimitUser); | ||||||||||||||||||||||||||
} else { | ||||||||||||||||||||||||||
user_ = g_pika_server->Acl()->GetUserLock(Acl::DefaultUser); | ||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||
authenticated_ = user_->HasFlags(static_cast<uint32_t>(AclUserFlag::NO_PASS)) && | ||||||||||||||||||||||||||
!user_->HasFlags(static_cast<uint32_t>(AclUserFlag::DISABLED)); | ||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||
bool PikaClientConn::AuthRequired() const { | ||||||||||||||||||||||||||
// If the user does not have a password, and the user is valid, then the user does not need authentication | ||||||||||||||||||||||||||
// Otherwise, you need to determine whether go has been authenticated | ||||||||||||||||||||||||||
return (!user_->HasFlags(static_cast<uint32_t>(AclUserFlag::NO_PASS)) || | ||||||||||||||||||||||||||
user_->HasFlags(static_cast<uint32_t>(AclUserFlag::DISABLED))) && | ||||||||||||||||||||||||||
!IsAuthed(); | ||||||||||||||||||||||||||
if (IsAuthed()) { | ||||||||||||||||||||||||||
return false; | ||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||
if (user_->HasFlags(static_cast<uint32_t>(AclUserFlag::DISABLED))) { | ||||||||||||||||||||||||||
return true; | ||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||
if (user_->HasFlags(static_cast<uint32_t>(AclUserFlag::NO_PASS))) { | ||||||||||||||||||||||||||
return false; | ||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||
return true; | ||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||
std::string PikaClientConn::UserName() const { return user_->Name(); } | ||||||||||||||||||||||||||
|
||||||||||||||||||||||||||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Refactor duplicated blacklist processing logic.
The blacklist processing logic is duplicated between the two code blocks. Consider extracting this into a helper method to improve maintainability and reduce code duplication.
Apply this diff to extract the common logic:
Also applies to: 512-515