139 lines
5.5 KiB
C#
139 lines
5.5 KiB
C#
using Microsoft.AspNetCore.Mvc;
|
|
using Microsoft.AspNetCore.Mvc.Filters;
|
|
using Microsoft.AspNetCore.Mvc.Controllers;
|
|
using System.Linq;
|
|
using VolPro.Core.Controllers.Basic;
|
|
using VolPro.Core.Filters;
|
|
using VolPro.Core.UserManager;
|
|
using VolPro.Entity.DomainModels;
|
|
using VolPro.Core.ManageUser;
|
|
using VolPro.Core.Enums;
|
|
using VolPro.Core.Utilities;
|
|
using Microsoft.AspNetCore.Mvc.Authorization;
|
|
using System.Reflection;
|
|
using VolPro.Core.Extensions;
|
|
|
|
namespace VolPro.Core.Generic
|
|
{
|
|
[JWTAuthorize, ApiController]
|
|
public class GenericBaseController : VolController
|
|
{
|
|
public GenericBaseController() { }
|
|
public override void OnActionExecuting(ActionExecutingContext context)
|
|
{
|
|
GenericTableAsyncLocal.Clear();
|
|
string TableName = null;
|
|
if (context.ActionArguments?.Count > 0)
|
|
{
|
|
foreach (var argument in context.ActionArguments.Values.Where(argument => argument != null))
|
|
{
|
|
|
|
var argumentType = argument.GetType();
|
|
if (argumentType == typeof(PageDataOptions)|| argumentType == typeof(SaveModel))
|
|
{
|
|
var tableNameProperty = argumentType.GetProperty("TableName");
|
|
if (tableNameProperty != null)
|
|
{
|
|
TableName = tableNameProperty.GetValue(argument)?.ToString();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
WebResponseContent webResponse = new();
|
|
if (string.IsNullOrEmpty(TableName))
|
|
{
|
|
TableName = HttpContext.Request.Query["tableName"];
|
|
}
|
|
if (string.IsNullOrEmpty(TableName))
|
|
{
|
|
context.Result = GetResult(context, "缺少参数table,请检查代码生成器生器Sys_TableInfo、Sys_TableColumn是否有当前表配置,或菜单设置的表名是否正确");
|
|
return;
|
|
}
|
|
var list = TableColumnContext.TableInfo
|
|
.Where(x => x.TableName == TableName).ToList();
|
|
if (list.Count == 0)
|
|
{
|
|
context.Result = GetResult(context, $"未找到表【{TableName}】 配置信息,请检查代码生成器配置是否存在当前表");
|
|
context.Result = Json(webResponse);
|
|
return;
|
|
}
|
|
if (list.Count > 1)
|
|
{
|
|
context.Result = GetResult(context, $"表【{TableName}】 存在多个配置信息,请检查代码生成器配置是否重复");
|
|
return;
|
|
}
|
|
|
|
GenericTableAsyncLocal.CurrentTableName = TableName;
|
|
if (context.Filters.Any(item => item is IAllowAnonymousFilter))
|
|
{
|
|
base.OnActionExecuting(context);
|
|
return;
|
|
}
|
|
if (UserContext.Current.IsSuperAdmin)
|
|
{
|
|
base.OnActionExecuting(context);
|
|
return;
|
|
}
|
|
|
|
string[] currentActionPermissionNames = [];
|
|
if (!(context.ActionDescriptor is ControllerActionDescriptor controllerActionDescriptor))
|
|
{
|
|
base.OnActionExecuting(context);
|
|
return;
|
|
}
|
|
CustomAttributeData attrData = controllerActionDescriptor.MethodInfo
|
|
.CustomAttributes
|
|
.FirstOrDefault(a => a.AttributeType == typeof(ApiActionPermissionAttribute))
|
|
?? controllerActionDescriptor.ControllerTypeInfo
|
|
.CustomAttributes
|
|
.FirstOrDefault(a => a.AttributeType == typeof(ApiActionPermissionAttribute));
|
|
|
|
if (attrData == null)
|
|
{
|
|
base.OnActionExecuting(context);
|
|
return;
|
|
}
|
|
ActionPermissionOptions currentActionPermission = default;
|
|
foreach (var arg in attrData.ConstructorArguments)
|
|
{
|
|
if (arg.ArgumentType == typeof(ActionPermissionOptions) && arg.Value != null)
|
|
{
|
|
currentActionPermission = (ActionPermissionOptions)arg.Value;
|
|
break;
|
|
}
|
|
}
|
|
if (Equals(currentActionPermission, default(ActionPermissionOptions)))
|
|
{
|
|
base.OnActionExecuting(context);
|
|
return;
|
|
}
|
|
//ActionPermissionFilter.cs中统一验证权限
|
|
//var names = new List<string>();
|
|
//foreach (ActionPermissionOptions option in Enum.GetValues(typeof(ActionPermissionOptions)))
|
|
//{
|
|
// if (option == 0) continue;
|
|
// if (currentActionPermission.HasFlag(option))
|
|
// {
|
|
// names.Add(option.ToString());
|
|
// }
|
|
//}
|
|
//currentActionPermissionNames = names.ToArray();
|
|
//var hasActionAuth = UserContext.Current.Permissions
|
|
// .Where(x => x.TableName == TableName.ToLower())
|
|
// .Any(c => c.UserAuthArr != null && currentActionPermissionNames.Any(action => c.UserAuthArr.Contains(action)));
|
|
|
|
//if (!hasActionAuth)
|
|
//{
|
|
// context.Result = GetResult(context, "没有权限操作");
|
|
// return;
|
|
//}
|
|
base.OnActionExecuting(context);
|
|
}
|
|
private IActionResult GetResult(ActionExecutingContext context, string message)
|
|
{
|
|
return Json(new { status = false, message });
|
|
}
|
|
}
|
|
}
|