Exemple #1
0
        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());
                }
            });
        }
Exemple #2
0
        //得到这样的结果
        //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);
        }