public void GetControllerAttributes() { List <Type> assembly = typeof(Startup).Assembly.GetTypes().AsEnumerable() .Where(type => typeof(ControllerBase).IsAssignableFrom(type)).ToList(); assembly.ForEach(d => { LinCmsAuthorizeAttribute linCmsAuthorize = d.GetCustomAttribute <LinCmsAuthorizeAttribute>(); if (linCmsAuthorize != null) { _testOutputHelper.WriteLine(linCmsAuthorize.ToString()); } }); }
//得到这样的结果 //LinCms.Zero.Data.PermissionDto Permission:查询日志记录的用户、Module:日志、Router:cms.log.get_users //LinCms.Zero.Data.PermissionDto Permission:查询所有日志、Module:日志、Router:cms.log.get_logs //LinCms.Zero.Data.PermissionDto Permission:搜索日志、Module:日志、Router:cms.log.get_user_logs //LinCms.Zero.Data.PermissionDto Permission:查看lin的信息、Module:信息、Router:cms.test.info //LinCms.Zero.Data.PermissionDto Permission:删除图书、Module:图书、Router:v1.book.delete_book /// <summary> /// 通过反射得到LinCmsAttrbutes所有权限结构,为树型权限生成做准备 /// </summary> /// <returns></returns> public static List <PermissionDefinition> GetAssemblyLinCmsAttributes() { List <PermissionDefinition> linAuths = new List <PermissionDefinition>(); List <Type> assembly = typeof(Program).Assembly.GetTypes().AsEnumerable() .Where(type => typeof(ControllerBase).IsAssignableFrom(type)).ToList(); //通过反射得到控制器上的权限特性标签 assembly.ForEach(d => { LinCmsAuthorizeAttribute linCmsAuthorize = d.GetCustomAttribute <LinCmsAuthorizeAttribute>(); RouteAttribute routerAttribute = d.GetCustomAttribute <RouteAttribute>(); if (linCmsAuthorize?.Permission != null && routerAttribute?.Template != null) { linAuths.Add(new PermissionDefinition(linCmsAuthorize.Permission, linCmsAuthorize.Module, routerAttribute.Template)); } }); //得到方法上的权限特性标签,并排除无权限及模块的非固定权限 assembly.ForEach(r => { RouteAttribute routerAttribute = r.GetCustomAttribute <RouteAttribute>(); if (routerAttribute?.Template != null) { foreach (MethodInfo methodInfo in r.GetMethods()) { HttpMethodAttribute methodAttribute = GetMethodAttribute(methodInfo); foreach (Attribute attribute in methodInfo.GetCustomAttributes()) { if (attribute is LinCmsAuthorizeAttribute linAttribute && linAttribute.Permission.IsNotNullOrEmpty() && linAttribute.Module.IsNotNullOrEmpty()) { string actionTemplate = methodAttribute.Template != null ? "/" + methodAttribute.Template + " " : " "; string router = $"{routerAttribute.Template}{actionTemplate}{methodAttribute.HttpMethods.FirstOrDefault()}"; linAuths.Add( new PermissionDefinition( linAttribute.Permission, linAttribute.Module, router ) ); //methodInfo.Name.ToSnakeCase() } } } } }); return(linAuths.Distinct().ToList()); }
//得到这样的结果 //LinCms.Zero.Data.PermissionDto Permission:查询日志记录的用户、Module:日志、Router:cms.log+get_users //LinCms.Zero.Data.PermissionDto Permission:查询所有日志、Module:日志、Router:cms.log+get_logs //LinCms.Zero.Data.PermissionDto Permission:搜索日志、Module:日志、Router:cms.log+get_user_logs //LinCms.Zero.Data.PermissionDto Permission:查看lin的信息、Module:信息、Router:cms.test+info //LinCms.Zero.Data.PermissionDto Permission:删除图书、Module:图书、Router:v1.book+delete_book /// <summary> /// 通过反射得到LinCmsAttrbutes所有权限结构,为树型权限生成做准备 /// </summary> /// <returns></returns> public static List <PermissionDto> GeAssemblyLinCmsAttributes() { List <PermissionDto> linAuths = new List <PermissionDto>(); List <Type> assembly = typeof(Startup).Assembly.GetTypes().AsEnumerable() .Where(type => typeof(ControllerBase).IsAssignableFrom(type)).ToList(); //通过反射得到控制器上的权限特性标签 assembly.ForEach(d => { LinCmsAuthorizeAttribute linCmsAuthorize = d.GetCustomAttribute <LinCmsAuthorizeAttribute>(); RouteAttribute routerAttribute = d.GetCustomAttribute <RouteAttribute>(); if (linCmsAuthorize?.Permission != null && routerAttribute?.Template != null) { linAuths.Add(new PermissionDto(linCmsAuthorize.Permission, linCmsAuthorize.Module, routerAttribute.Template.Replace("/", "."))); } }); //得到方法上的权限特性标签,并排除无权限及模块的非固定权限 assembly.ForEach(r => { RouteAttribute routerAttribute = r.GetCustomAttribute <RouteAttribute>(); if (routerAttribute?.Template != null) { foreach (MethodInfo methodInfo in r.GetMethods()) { foreach (Attribute attribute in methodInfo.GetCustomAttributes()) { if (attribute is LinCmsAuthorizeAttribute linCmsAuthorize && linCmsAuthorize.Permission.IsNotNullOrEmpty() && linCmsAuthorize.Module.IsNotNullOrEmpty()) { linAuths.Add( new PermissionDto( linCmsAuthorize.Permission, linCmsAuthorize.Module, $"{routerAttribute.Template.Replace("/", ".")}+{methodInfo.Name.ToSnakeCase()}" ) ); } } } } }); return(linAuths); }
public override void OnActionExecuted(ActionExecutedContext context) { Stopwatch.Stop(); //当方法或控制器上存在DisableAuditingAttribute特性标签时,不记录日志 if (context.ActionDescriptor is ControllerActionDescriptor d && d.MethodInfo.IsDefined(typeof(DisableAuditingAttribute), true) || context.Controller.GetType().IsDefined(typeof(DisableAuditingAttribute), true) ) { base.OnActionExecuted(context); return; } LinLog linLog = new LinLog() { Method = context.HttpContext.Request.Method, Path = context.HttpContext.Request.Path, StatusCode = context.HttpContext.Response.StatusCode, OtherMessage = $"参数:{ActionArguments}\n耗时:{Stopwatch.Elapsed.TotalMilliseconds} 毫秒" }; ControllerActionDescriptor auditActionDescriptor = context.ActionDescriptor as ControllerActionDescriptor; AuditingLogAttribute auditingLogAttribute = auditActionDescriptor.GetCustomAttribute <AuditingLogAttribute>(); if (auditingLogAttribute != null) { linLog.Message = auditingLogAttribute.Template; } LinCmsAuthorizeAttribute linCmsAttribute = auditActionDescriptor.GetCustomAttribute <LinCmsAuthorizeAttribute>(); if (linCmsAttribute != null) { linLog.Authority = linCmsAttribute.Permission; } base.OnActionExecuted(context); if (context.Result is ObjectResult objectResult && objectResult.Value != null) { if (objectResult.Value.ToString().Contains("ErrorCode")) { ResultDto resultDto = JsonConvert.DeserializeObject <ResultDto>(objectResult.Value.ToString()); resultDto.Request = LinCmsUtils.GetRequest(context.HttpContext); context.Result = new JsonResult(resultDto); if (linLog.Message.IsNullOrEmpty()) { linLog.Message = resultDto.Msg?.ToString(); } } } linLog.Message += $"{_currentUser.UserName}访问{context.HttpContext.Request.Path},耗时:{Stopwatch.Elapsed.TotalMilliseconds} 毫秒"; _logService.InsertLog(linLog); //记录文本日志 _logger.LogInformation(JsonConvert.SerializeObject(linLog)); //MiniProfiler.Current.CustomTiming($"OnActionExecuted ->", str); }