浏览代码

fix: improve superadmin group assignment during login

Load superadmin group ID from GroupService instead of hardcoding
the group name. First registered user gets automatically assigned
to the superadmin group on login.
Fszontagh 6 月之前
父节点
当前提交
d8303bcb6e
共有 1 个文件被更改,包括 24 次插入6 次删除
  1. 24 6
      webserver/src/http_server.cpp

+ 24 - 6
webserver/src/http_server.cpp

@@ -865,13 +865,31 @@ void HttpServer::HandleAuthLogin(const httplib::Request& req, httplib::Response&
             }
         }
 
-        // Determine user groups (superadmin is a special case - first user is superadmin)
+        // Collect user's groups from memberships
         std::vector<std::string> groups;
-        auto all_users = userService_->ListUsers();
-        if (all_users.users.size() == 1 ||
-            (!all_users.users.empty() && all_users.users[0].id == user.id)) {
-            // First user is superadmin
-            groups.push_back("superadmin");
+        if (membershipService_) {
+            auto memberships = membershipService_->ListUserMemberships(user.id);
+            for (const auto& m : memberships.members) {
+                for (const auto& gid : m.group_ids) {
+                    if (std::find(groups.begin(), groups.end(), gid) == groups.end()) {
+                        groups.push_back(gid);
+                    }
+                }
+            }
+        }
+
+        // First registered user is automatically superadmin
+        if (groupService_) {
+            auto superadmin_group = groupService_->GetSuperadminGroup();
+            if (superadmin_group.success && superadmin_group.group) {
+                auto all_users = userService_->ListUsers();
+                if (!all_users.users.empty() && all_users.users[0].id == user.id) {
+                    const auto& sa_id = superadmin_group.group->id;
+                    if (std::find(groups.begin(), groups.end(), sa_id) == groups.end()) {
+                        groups.push_back(sa_id);
+                    }
+                }
+            }
         }
 
         auto tokens = authService_->GenerateTokens(user.id, email, workspace_ids, groups);