Przeglądaj źródła

修复api权限判断

tian_z 3 lat temu
rodzic
commit
f86f1d403e

+ 9 - 1
Admin.NET/Admin.NET.Core/Service/Menu/SysMenuService.cs

@@ -166,7 +166,7 @@ namespace Admin.NET.Core.Service
         /// </summary>
         /// <returns></returns>
         [HttpGet("getPermCode")]
-        public async Task<dynamic> GetPermCodeList()
+        public async Task<List<string>> GetPermCodeList()
         {
             if (_userManager.SuperAdmin)
             {
@@ -184,6 +184,14 @@ namespace Admin.NET.Core.Service
             }
         }
 
+        [NonAction]
+        public async Task<List<string>> GetAllPermCodeList()
+        {
+            return await _sysMenuRep.AsQueryable()
+                    .Where(u => u.Type == MenuTypeEnum.Btn)
+                    .Select(u => u.Permission).ToListAsync();
+        }
+
         /// <summary>
         /// 获取当前用户菜单Id集合
         /// </summary>

+ 31 - 6
Admin.NET/Admin.NET.Web.Core/Handlers/JwtHandler.cs

@@ -1,9 +1,11 @@
 using Admin.NET.Core;
+using Admin.NET.Core.Service;
 using Furion;
 using Furion.Authorization;
 using Furion.DataEncryption;
 using Microsoft.AspNetCore.Authorization;
 using Microsoft.AspNetCore.Http;
+using System.Collections.Generic;
 using System.Threading.Tasks;
 
 namespace Admin.NET.Web.Core
@@ -46,14 +48,37 @@ namespace Admin.NET.Web.Core
         /// <returns></returns>
         private static async Task<bool> CheckAuthorzieAsync(DefaultHttpContext httpContext)
         {
-            //// 管理员跳过判断
-            //var userManager = App.GetService<UserManager>();
-            //if (userManager.SuperAdmin) return true;
+            // 管理员跳过判断
+            if (App.User.FindFirst(ClaimConst.SuperAdmin)?.Value == ((int)UserTypeEnum.SuperAdmin).ToString()) return true;
 
-            //// 路由名称
-            //var routeName = httpContext.Request.Path.Value[1..].Replace("/", ":");
+            // 路由名称
+            var routeName = "";
+            if (httpContext.Request.Path.StartsWithSegments("/api"))
+            {
+                routeName = httpContext.Request.Path.Value[5..].Replace("/", ":");
+            }
+            else
+            {
+                routeName = httpContext.Request.Path.Value[1..].Replace("/", ":");
+            }
+
+            // 默认路由(获取登录用户信息)
+            var defalutRoute = new List<string>()
+            {
+                "getLoginUser",     //登录
+                "sysMenu:change"    //切换顶部菜单
+            };
+
+            if (defalutRoute.Contains(routeName)) return true;
+
+            // 获取用户权限集合(按钮或API接口)
+            var permissionList = await App.GetService<SysMenuService>().GetPermCodeList();
+            var allPermissionList = await App.GetService<SysMenuService>().GetAllPermCodeList();
 
-            return await Task.FromResult(true);
+            // 检查授权
+            // 菜单中没有配置按钮权限,则不限制
+            return permissionList.Exists(p => p.Equals(routeName, System.StringComparison.CurrentCultureIgnoreCase))
+                || allPermissionList.TrueForAll(p => !p.Equals(routeName, System.StringComparison.CurrentCultureIgnoreCase));
         }
     }
 }