From 4ed8c0819b48470e0de57c2e210e6cbdbcb4862d Mon Sep 17 00:00:00 2001 From: yubaolee Date: Sat, 2 Aug 2025 18:53:10 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9Bfix:=20#ICGHSO=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E5=9B=A0=E7=BB=9F=E4=B8=80Sqlsugar=E5=BC=95=E8=B5=B7=E7=9A=84B?= =?UTF-8?q?UG?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- OpenAuth.App/Test/TestBase.cs | 9 +++++ OpenAuth.App/UserManager/UserManagerApp.cs | 47 ++++++++++++++-------- 2 files changed, 39 insertions(+), 17 deletions(-) diff --git a/OpenAuth.App/Test/TestBase.cs b/OpenAuth.App/Test/TestBase.cs index 9d949e24..b6ce879f 100644 --- a/OpenAuth.App/Test/TestBase.cs +++ b/OpenAuth.App/Test/TestBase.cs @@ -100,6 +100,15 @@ namespace OpenAuth.App.Test Console.WriteLine($"添加数据库连接: {conn.Key} / {(dbtypes.ContainsKey(conn.Key) ? dbtypes[conn.Key] : "未指定类型")},连接字符串:{conn.Value}"); } + //通过ConfigId为空判断是否有默认的连接字符串 + if(!connectionConfigs.Any(x => x.ConfigId == null)) + { + throw new Exception($"没有找到默认的连接字符串:{Define.DEFAULT_TENANT_ID}"); + } + + //把connectionConfigs排序,ConfigId为空的放在最前面,即默认的连接字符串必须排最前面 + connectionConfigs = connectionConfigs.OrderBy(x => x.ConfigId == null ? 0 : 1).ToList(); + var sqlSugar = new SqlSugarClient(connectionConfigs); // 配置PostgreSQL数据库处理 diff --git a/OpenAuth.App/UserManager/UserManagerApp.cs b/OpenAuth.App/UserManager/UserManagerApp.cs index 92bafb74..4661e4e0 100644 --- a/OpenAuth.App/UserManager/UserManagerApp.cs +++ b/OpenAuth.App/UserManager/UserManagerApp.cs @@ -42,29 +42,42 @@ namespace OpenAuth.App var query = SugarClient.Queryable(); if (!string.IsNullOrEmpty(request.key)) { - query = SugarClient.Queryable().Where(u => u.Name.Contains(request.key) || u.Account.Contains(request.key)); + query = query.Where(u => u.Name.Contains(request.key) || u.Account.Contains(request.key)); } + + var orgs = SugarClient.Queryable(); + if(!ignoreAuth) //如果没有忽略权限,则只能访问自己所在的机构 + { + var orgIds = loginUser.Orgs.Select(u => u.Id).ToArray(); + orgs = orgs.Where(u => orgIds.Contains(u.Id)); + } + + if(!string.IsNullOrEmpty(request.orgId)) //如果请求的orgId不为空,加载这个机构及该机构下级的所有用户 + { + var reqorg = SugarClient.Queryable().First(u => u.Id == request.orgId); + var cascadeId = reqorg.CascadeId; + var orgIds = orgs.Where(u => u.CascadeId.Contains(cascadeId)).Select(u => u.Id).ToArray(); + var userIds = SugarClient.Queryable().Where(r => r.RelKey == Define.USERORG + && orgIds.Contains(r.SecondId)).Select(r => r.FirstId).Distinct().ToList(); + query = query.Where(u => userIds.Contains(u.Id)); + + }else{ + if(!ignoreAuth) //如果没有忽略权限,则根据用户所在的机构获取用户 + { + var orgIds = orgs.Select(o => o.Id).ToArray(); + var userIds = SugarClient.Queryable().Where(r => r.RelKey == Define.USERORG + && orgIds.Contains(r.SecondId)).Select(r => r.FirstId).Distinct().ToList(); + query = query.Where(u => userIds.Contains(u.Id)); + } + + //没有限制权限、没有传入orgId,则query就是获取最原始的所有用户 + } + var userOrgs = query .LeftJoin((user, u) => user.ParentId == u.Id) .LeftJoin((user, u, r) => user.Id == r.FirstId && r.RelKey == Define.USERORG) .LeftJoin((user, u, r, o) => r.SecondId == o.Id); - //如果请求的orgId不为空,加载用户可以看到的机构及下级的所有用户 - if (!string.IsNullOrEmpty(request.orgId)) - { - var org = loginUser.Orgs.SingleOrDefault(u => u.Id == request.orgId); - var cascadeId = org.CascadeId; - var orgIds = loginUser.Orgs.Where(u => u.CascadeId.Contains(cascadeId)).Select(u => u.Id).ToArray(); - //只获取机构里面的用户 - userOrgs = userOrgs.Where((user, u, r, o) => r.RelKey == Define.USERORG && orgIds.Contains(o.Id)); - } - else if (!ignoreAuth) //如果请求的orgId为空,即为跟节点,如果不忽略权限,只能获取到用户可以看到的机构及未分配机构的用户 - { - var orgIds = loginUser.Orgs.Select(u => u.Id).ToArray(); - //获取用户可以访问的机构的用户和没有任何机构关联的用户(机构被删除后,没有删除这里面的关联关系) - userOrgs = userOrgs.Where((user, u, r, o) => (r.RelKey == Define.USERORG && orgIds.Contains(o.Id)) || (o == null)); - } - var userOrgsResult = userOrgs.Select((user, u, r, o) => new { Account = user.Account,