Преглед изворни кода

!1573 角色权限判定
Merge pull request !1573 from 冰魄少年/next

zuohuaijun пре 1 година
родитељ
комит
c6ec9a953d

+ 20 - 0
Admin.NET/Admin.NET.Core/Service/Org/SysOrgService.cs

@@ -332,6 +332,26 @@ public class SysOrgService : IDynamicApiController, ITransient
         return await GetUserOrgIdList(roleList, userId, userOrgId);
     }
 
+    /// <summary>
+    /// 判定用户是否有某角色权限
+    /// </summary>
+    /// <param name="userId"></param>
+    /// <param name="role">角色代码</param>
+    /// <returns></returns>
+    [NonAction]
+    public async Task<bool> GetUserHasRole(long userId, SysRole role)
+    {
+        if (_userManager.SuperAdmin)
+            return true;
+        var userOrgId = _userManager.OrgId;
+        var roleList = await _sysUserRoleService.GetUserRoleList(userId);
+        if (roleList != null && roleList.Exists(r => r.Code == role.Code) == true)
+            return true;
+        roleList = new List<SysRole> { role };
+        var orgIds = await GetUserOrgIdList(roleList, userId, userOrgId);
+        return orgIds.Contains(userOrgId);
+    }
+
     /// <summary>
     /// 根据角色Id集合获取机构Id集合
     /// </summary>

+ 3 - 1
Admin.NET/Admin.NET.Core/Service/Role/SysRoleService.cs

@@ -42,9 +42,11 @@ public class SysRoleService : IDynamicApiController, ITransient
     [DisplayName("获取角色分页列表")]
     public async Task<SqlSugarPagedList<SysRole>> Page(PageRoleInput input)
     {
+        // 当前用户已拥有的角色集合
+        var roleIdList = _userManager.SuperAdmin ? new List<long>() : await _sysUserRoleService.GetUserRoleIdList(_userManager.UserId);
         return await _sysRoleRep.AsQueryable()
             .WhereIF(!_userManager.SuperAdmin, u => u.TenantId == _userManager.TenantId) // 若非超管,则只能操作本租户的角色
-            .WhereIF(!_userManager.SuperAdmin && !_userManager.SysAdmin, u => u.CreateUserId == _userManager.UserId) // 若非超管且非系统管理员,则只能操作自己创建的角色
+            .WhereIF(!_userManager.SuperAdmin && !_userManager.SysAdmin, u => u.CreateUserId == _userManager.UserId || roleIdList.Contains(u.Id)) // 若非超管且非系统管理员,则只能操作自己创建的角色|自己拥有的角色
             .WhereIF(!string.IsNullOrWhiteSpace(input.Name), u => u.Name.Contains(input.Name))
             .WhereIF(!string.IsNullOrWhiteSpace(input.Code), u => u.Code.Contains(input.Code))
             .OrderBy(u => new { u.OrderNo, u.Id })