• ABP理论学习之审计日志


    返回总目录


    本篇目录


    介绍

    维基百科说: “审计跟踪(也叫审计日志)是与安全相关的按照时间顺序的记录,记录集或者记录源,它们提供了活动序列的文档证据,这些活动序列可以在任何时间影响一个特定的操作,步骤或其他”。

    ABP提供了一个基础设施,它可以自动记录所有和应用程序交互的日志。它可以记录具有调用者信息和参数的方法调用。

    一般地,要保存的字段是:相关的租户Id,调用者的用户Id,调用的 服务名称(调用方法的类名),调用的方法名 , 执行方法名(序列化成Json) , 执行时间 , 执行时长(单位毫秒),客户端IP地址 ,客户端计算机名称异常(抛出异常的情况下)。

    有了这些信息,我们不仅知道谁进行了该操作,而且可以测量应用的性能以及观察抛出的异常。甚至,你可以获得应用使用情况的统计数据(statistics)

    审计系统使用IAbpSession来获得当前的UserId和TenantId。

    关于 IAuditingStore

    审计系统使用了IAuditingStore来存储信息。虽然你可以用你自己的方式来实现该接口,但是它已经完全实现在module-zero项目中。如果你没有实现该接口,那么默认会使用SimpleLogAuditingStore,并且它会将审计信息记录到日志中(log)。

    配置

    要配置审计,可以在模块的PreInitialize方法中使用Configuration.Auditing属性。审计是默认开启的。可以像下面那样关闭它:

    public class MyModule : AbpModule
    {
        public override void PreInitialize()
        {
            Configuration.Auditing.IsEnabled = false;
        }
    
        //...
    }
    
    

    这儿是审计配置属性的列表:

    • IsEnabled:用于完全开启或关闭审计系统。默认为true。
    • IsEnabledForAnonymousUsers:如果此值为true,那么没有登录到系统的用户的审计日志也会保存。默认为false。
    • MvcControllers:用于为ASP.NET MVC控制器配置审计。
      • IsEnabled:用于为MVC控制器开启或关闭审计。默认为true
      • IsEnabledForChildActions:用于为子MVC action开启或关闭审计。默认为false。
    • Selectors:用于选择其他的类保存审计日志。

    可以看到,对于MVC控制器的审计是单独配置的,因为它用到了不同的技术。

    Selectors是选择其他的类型来保存审计日志的谓词列表。一个选择器有一个唯一的名字和一个谓词。这个列表中唯一的默认选择器用于选择应用服务类。它是如下定义的:

    Configuration.Auditing.Selectors.Add(
        new NamedTypeSelector(
            "Abp.ApplicationServices",
            type => typeof (IApplicationService).IsAssignableFrom(type)
        )
    );
    
    

    你可以将你的选择器添加到模块的PreInitialize方法中。而且,如果你不喜欢为应用服务保存审计日志,那么你可以通过名称移除选择器。那就是为什么要有一个唯一名称的原因(使用简单的linq找出该选择器,然后可以移除它)。

    通过特性开启/关闭

    虽然可以通过配置选择审计类,但是也可以为一个单独的类或方法使用AuditedDisableAuditing特性。举个例子:

    [Audited]
    public class MyClass
    {
        public void MyMethod1(int a)
        {
            //...
        }
    
        [DisableAuditing]
        public void MyMethod2(string b)
        {
            //...
        }
    
        public void MyMethod3(int a, int b)
        {
            //...
        }
    }
    
    

    除了MyMethod2方法之外,MyClass的所有方法都参与审计了,因为MyMethod2显式关闭了。审计特性可以用于想要参与审计的方法保存审计日志。

    注意

    • 为了保存审计日志,方法必须是public的。私有的和受保护的方法会被忽略。
    • 如果方法是通过类的引用调用的,那么该方法必须是virtual的。因为ABP使用了动态代理和拦截,所以需要满足该条件。如果使用了接口(比如注入IPersonService接口使用PersonService类)注入,就不必满足“virtual”的条件了。对于MVC控制器的action不一定要满足,它们可以不是“virtual”的。

    我项目中的例子

    下面的代码是点击登录按钮提交表单数据的action方法:

    [HttpPost]
    [UnitOfWork]
    [DisableAuditing]
    public virtual async Task<JsonResult> Login(LoginViewModel loginModel, string returnUrl = "")
    {
        CheckModelState();
    
        _unitOfWorkManager.Current.DisableFilter(AbpDataFilters.MayHaveTenant);
        var loginResult = await GetLoginResultAsync(
            loginModel.UsernameOrEmailAddress,
            loginModel.Password,
            loginModel.TenancyName
            );
        await SignInAsync(loginResult.User, loginResult.Identity, loginModel.RememberMe);
    
        if (string.IsNullOrWhiteSpace(returnUrl))
        {
            returnUrl = Request.ApplicationPath;
        }
        return Json(new MvcAjaxResponse { TargetUrl = returnUrl });
    }
    
    
    

    下面的截图是数据库中的审计日志信息,大家可以看到今天还没有数据,最晚的数据是2015-12-18的数据:

    登录系统之后,依然没有记录审计日志,下面统一截图。

    下面我将上面的代码的特性[DisableAuditing]去掉,再次登录系统,可以看到有了审计记录,截图如下:

    分别按序号解释一下:

    1. 首次到达登录页面;
    2. 登录成功,到达系统首页Index;
    3. 去掉[DisableAuditing]特性后,到达登陆页面;
    4. 将数据post提交到Login方法,记录了审计日志,包含各种登录参数;
    5. 登录成功,返回系统首页Index。

    从我的例子可以很明显地看出,默认情况下,ABP会自动记录所有的控制器,除非你给它加上[DisableAuditing]特性,否则,始终会记录审计日志。

  • 相关阅读:
    弱网环境测试点总结
    【CMDB】高级配置
    【CMDB】获取服务器数据
    Centos部属前后端项目
    Centos部署项目
    Django
    nginx反向代理和负载均衡
    nginx的配置
    centos7 安装nginx
    centos7 安装Virtualenv
  • 原文地址:https://www.cnblogs.com/farb/p/ABPAuditLog.html
走看看 - 开发者的网上家园