using Base; using Infrastructure; using Infrastructure.Model; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Filters; using Model; using Model.Base; using Services; using Util; namespace Middleware { /// /// API授权判断 /// public class ActionPermissionFilter : ActionFilterAttribute//, IAsyncActionFilter { private NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger(); /// /// 权限字符串,例如 system:user:view /// public string Permission { get; set; } = string.Empty; /// /// 角色字符串,例如 common,admin /// public string RolePermi { get; set; } = string.Empty; private bool HasPermi { get; set; } public ActionPermissionFilter() { } public ActionPermissionFilter(string permission) { Permission = permission; HasPermi = !string.IsNullOrEmpty(Permission); } /// /// 执行Action前校验是否有权限访问 /// /// /// /// public override Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next) { TokenModel info = JwtUtil.GetLoginUser(context.HttpContext); if (info != null && info?.userId > 0) { long userId = info.userId; List perms = CacheService.GetUserPerms(GlobalConstant.UserPermKEY + userId); List rolePerms = info.RoleIds; if (perms == null) { var sysPermissionService = App.GetService(); perms = sysPermissionService.List(); CacheService.SetUserPerms(GlobalConstant.UserPermKEY + userId, perms); } if (perms.Exists(f => f.Equals(GlobalConstant.AdminPerm))) { HasPermi = true; } else if (rolePerms.Exists(f => f.Equals(GlobalConstant.AdminRole))) { HasPermi = true; } else if (!string.IsNullOrEmpty(Permission)) { HasPermi = perms.Exists(f => f.ToLower() == Permission.ToLower()); } if (!HasPermi && !string.IsNullOrEmpty(RolePermi)) { HasPermi = info.RoleIds.Contains(RolePermi); } var url = context.HttpContext.Request.Path; if (!HasPermi && !Permission.Equals("common")) { logger.Info($"用户{info.username}没有权限访问{url},当前权限[{Permission}]"); JsonResult result = new(new ApiResult((int)ResultCode.FORBIDDEN, $"你当前没有权限访问,请联系管理员", url)) { ContentType = "application/json", }; context.HttpContext.Response.StatusCode = 403; context.Result = result; } } return base.OnActionExecutionAsync(context, next); } } }