fix: tenant ui admin visibility

This commit is contained in:
2026-03-06 16:19:42 +08:00
parent 8aad25bf26
commit d392a4c8c7
2 changed files with 24 additions and 4 deletions
+19 -2
View File
@@ -357,8 +357,9 @@ func main() {
ExpiresAt int64 `json:"expires_at"` ExpiresAt int64 `json:"expires_at"`
Role string `json:"role"` Role string `json:"role"`
Status int `json:"status"` Status int `json:"status"`
TenantID int64 `json:"tenant_id"`
Subnet string `json:"subnet"` Subnet string `json:"subnet"`
}{0, "ok", sessionToken, "session", exp, u.Role, u.Status, ""} }{0, "ok", sessionToken, "session", exp, u.Role, u.Status, u.TenantID, ""}
if ten != nil { if ten != nil {
resp.Subnet = ten.Subnet resp.Subnet = ten.Subnet
} }
@@ -581,6 +582,17 @@ func main() {
// Server uptime + detailed stats // Server uptime + detailed stats
mux.HandleFunc("/api/v1/stats", tenantMiddleware(func(w http.ResponseWriter, r *http.Request) { mux.HandleFunc("/api/v1/stats", tenantMiddleware(func(w http.ResponseWriter, r *http.Request) {
nodes := srv.GetOnlineNodes() nodes := srv.GetOnlineNodes()
// tenant-scoped stats
tenantID := getTenantID(r)
if tenantID > 0 {
filtered := make([]*server.NodeInfo, 0, len(nodes))
for _, n := range nodes {
if n.TenantID == tenantID {
filtered = append(filtered, n)
}
}
nodes = filtered
}
coneCount, symmCount, unknCount := 0, 0, 0 coneCount, symmCount, unknCount := 0, 0, 0
relayCount := 0 relayCount := 0
for _, n := range nodes { for _, n := range nodes {
@@ -596,7 +608,12 @@ func main() {
relayCount++ relayCount++
} }
} }
sdwan := srv.GetSDWAN() var sdwan protocol.SDWANConfig
if tenantID > 0 {
sdwan = srv.GetSDWANTenant(tenantID)
} else {
sdwan = srv.GetSDWAN()
}
w.Header().Set("Content-Type", "application/json") w.Header().Set("Content-Type", "application/json")
_ = json.NewEncoder(w).Encode(map[string]any{ _ = json.NewEncoder(w).Encode(map[string]any{
"nodes": len(nodes), "nodes": len(nodes),
+5 -2
View File
@@ -361,10 +361,11 @@ createApp({
const userForm = ref({ role:'operator', email:'', password:'' }); const userForm = ref({ role:'operator', email:'', password:'' });
const tokenType = ref(''); const tokenType = ref('');
const tenantId = ref(0);
const settings = ref({ advanced_impersonate:'0', advanced_force_network:'0', advanced_cross_tenant:'0' }); const settings = ref({ advanced_impersonate:'0', advanced_force_network:'0', advanced_cross_tenant:'0' });
const audit = ref([]); const audit = ref([]);
const auditTenant = ref(''); const auditTenant = ref('');
const isAdmin = computed(() => role.value === 'admin'); const isAdmin = computed(() => role.value === 'admin' && tenantId.value === 1);
const filteredTabs = computed(() => isAdmin.value ? tabs : tabs.filter(t => !['tenants','apikeys','users','enroll','settings','audit'].includes(t.id))); const filteredTabs = computed(() => isAdmin.value ? tabs : tabs.filter(t => !['tenants','apikeys','users','enroll','settings','audit'].includes(t.id)));
const filteredNodes = computed(() => { const filteredNodes = computed(() => {
const k = (nodeKeyword.value || '').trim().toLowerCase(); const k = (nodeKeyword.value || '').trim().toLowerCase();
@@ -416,6 +417,7 @@ createApp({
role.value = d.role || ''; role.value = d.role || '';
status.value = d.status ?? 1; status.value = d.status ?? 1;
tokenType.value = d.token_type || 'session'; tokenType.value = d.token_type || 'session';
tenantId.value = d.tenant_id || 0;
if (status.value !== 1) throw new Error('账号已停用'); if (status.value !== 1) throw new Error('账号已停用');
loggedIn.value = true; loggedIn.value = true;
await refreshAll(); await refreshAll();
@@ -433,6 +435,7 @@ createApp({
loggedIn.value = false; loggedIn.value = false;
role.value = ''; role.value = '';
tokenType.value = ''; tokenType.value = '';
tenantId.value = 0;
stopTimer(); stopTimer();
}; };
@@ -667,7 +670,7 @@ createApp({
}); });
return { return {
buildVersion, tab, filteredTabs, loggedIn, busy, msg, msgType, role, status, tokenType, buildVersion, tab, filteredTabs, loggedIn, busy, msg, msgType, role, status, tokenType, tenantId,
loginUser, loginPass, loginErr, refreshSec, loginUser, loginPass, loginErr, refreshSec,
health, stats, nodes, nodeKeyword, filteredNodes, sd, connectForm, health, stats, nodes, nodeKeyword, filteredNodes, sd, connectForm,
tenants, activeTenant, keys, users, enrolls, tenantForm, keyForm, userForm, tenants, activeTenant, keys, users, enrolls, tenantForm, keyForm, userForm,