Browse Source

Introduce IAuditInfoContributor.

pull/395/head
Halil ibrahim Kalkan 8 years ago
parent
commit
abbefbb139
  1. 11
      framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/Auditing/HttpContextClientInfoProvider.cs
  2. 1
      framework/src/Volo.Abp.AspNetCore/Volo.Abp.AspNetCore.csproj
  3. 17
      framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AuditInfoContributionContext.cs
  4. 38
      framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AuditingHelper.cs
  5. 7
      framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AuditingOptions.cs
  6. 31
      framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/ClientInfoAuditInfoContributor.cs
  7. 38
      framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/DefaultAuditInfoProvider.cs
  8. 9
      framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/IAuditInfoContributionContext.cs
  9. 9
      framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/IAuditInfoContributor.cs
  10. 14
      framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/IAuditInfoProvider.cs

11
framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Auditing/HttpContextClientInfoProvider.cs → framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/Auditing/HttpContextClientInfoProvider.cs

@ -1,9 +1,10 @@
using System; using System;
using Castle.Core.Logging;
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;
using Volo.Abp.Auditing; using Volo.Abp.Auditing;
namespace Volo.Abp.AspNetCore.Mvc.Auditing namespace Microsoft.AspNetCore.Auditing
{ {
public class HttpContextClientInfoProvider : IClientInfoProvider public class HttpContextClientInfoProvider : IClientInfoProvider
{ {
@ -13,7 +14,7 @@ namespace Volo.Abp.AspNetCore.Mvc.Auditing
public string ComputerName => GetComputerName(); public string ComputerName => GetComputerName();
public ILogger Logger { get; set; } public ILogger<HttpContextClientInfoProvider> Logger { get; set; }
private readonly IHttpContextAccessor _httpContextAccessor; private readonly IHttpContextAccessor _httpContextAccessor;
@ -27,7 +28,7 @@ namespace Volo.Abp.AspNetCore.Mvc.Auditing
_httpContextAccessor = httpContextAccessor; _httpContextAccessor = httpContextAccessor;
_httpContext = httpContextAccessor.HttpContext; _httpContext = httpContextAccessor.HttpContext;
Logger = NullLogger.Instance; Logger = NullLogger<HttpContextClientInfoProvider>.Instance;
} }
protected virtual string GetBrowserInfo() protected virtual string GetBrowserInfo()
@ -45,7 +46,7 @@ namespace Volo.Abp.AspNetCore.Mvc.Auditing
} }
catch (Exception ex) catch (Exception ex)
{ {
Logger.Warn(ex.ToString()); Logger.LogException(ex, LogLevel.Warning);
} }
return null; return null;

1
framework/src/Volo.Abp.AspNetCore/Volo.Abp.AspNetCore.csproj

@ -14,6 +14,7 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\Volo.Abp.Auditing\Volo.Abp.Auditing.csproj" />
<ProjectReference Include="..\Volo.Abp.Security\Volo.Abp.Security.csproj" /> <ProjectReference Include="..\Volo.Abp.Security\Volo.Abp.Security.csproj" />
<ProjectReference Include="..\Volo.Abp.Threading\Volo.Abp.Threading.csproj" /> <ProjectReference Include="..\Volo.Abp.Threading\Volo.Abp.Threading.csproj" />
<ProjectReference Include="..\Volo.Abp.VirtualFileSystem\Volo.Abp.VirtualFileSystem.csproj" /> <ProjectReference Include="..\Volo.Abp.VirtualFileSystem\Volo.Abp.VirtualFileSystem.csproj" />

17
framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AuditInfoContributionContext.cs

@ -0,0 +1,17 @@
using System;
namespace Volo.Abp.Auditing
{
public class AuditInfoContributionContext : IAuditInfoContributionContext
{
public IServiceProvider ServiceProvider { get; }
public AuditInfo AuditInfo { get; set; }
public AuditInfoContributionContext(IServiceProvider serviceProvider, AuditInfo auditInfo)
{
ServiceProvider = serviceProvider;
AuditInfo = auditInfo;
}
}
}

38
framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AuditingHelper.cs

@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Reflection; using System.Reflection;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using Volo.Abp.DependencyInjection; using Volo.Abp.DependencyInjection;
@ -19,21 +20,20 @@ namespace Volo.Abp.Auditing
protected ICurrentUser CurrentUser { get; } protected ICurrentUser CurrentUser { get; }
protected ICurrentTenant CurrentTenant { get; } protected ICurrentTenant CurrentTenant { get; }
protected IClock Clock { get; } protected IClock Clock { get; }
protected IAuditInfoProvider AuditInfoProvider;
protected AuditingOptions Options; protected AuditingOptions Options;
protected IAuditSerializer AuditSerializer; protected IAuditSerializer AuditSerializer;
protected IServiceProvider ServiceProvider;
public AuditingHelper( public AuditingHelper(
IAuditInfoProvider auditInfoProvider,
IAuditSerializer auditSerializer, IAuditSerializer auditSerializer,
IOptions<AuditingOptions> options, IOptions<AuditingOptions> options,
ICurrentUser currentUser, ICurrentUser currentUser,
ICurrentTenant currentTenant, ICurrentTenant currentTenant,
IClock clock, IClock clock,
IAuditingStore auditingStore, IAuditingStore auditingStore,
ILogger<AuditingHelper> logger) ILogger<AuditingHelper> logger,
IServiceProvider serviceProvider)
{ {
AuditInfoProvider = auditInfoProvider;
Options = options.Value; Options = options.Value;
AuditSerializer = auditSerializer; AuditSerializer = auditSerializer;
CurrentUser = currentUser; CurrentUser = currentUser;
@ -42,6 +42,7 @@ namespace Volo.Abp.Auditing
AuditingStore = auditingStore; AuditingStore = auditingStore;
Logger = logger; Logger = logger;
ServiceProvider = serviceProvider;
} }
public virtual bool ShouldSaveAudit(MethodInfo methodInfo, bool defaultValue = false) public virtual bool ShouldSaveAudit(MethodInfo methodInfo, bool defaultValue = false)
@ -109,18 +110,31 @@ namespace Volo.Abp.Auditing
ExecutionTime = Clock.Now ExecutionTime = Clock.Now
}; };
try ExecuteContributors(auditInfo);
{
AuditInfoProvider.Fill(auditInfo);
}
catch (Exception ex)
{
Logger.LogException(ex, LogLevel.Warning);
}
return auditInfo; return auditInfo;
} }
protected virtual void ExecuteContributors(AuditInfo auditInfo)
{
using (var scope = ServiceProvider.CreateScope())
{
var context = new AuditInfoContributionContext(scope.ServiceProvider, auditInfo);
foreach (var contributor in Options.Contributors)
{
try
{
contributor.Contribute(context);
}
catch (Exception ex)
{
Logger.LogException(ex, LogLevel.Warning);
}
}
}
}
public virtual void Save(AuditInfo auditInfo) public virtual void Save(AuditInfo auditInfo)
{ {
AuditingStore.Save(auditInfo); AuditingStore.Save(auditInfo);

7
framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AuditingOptions.cs

@ -11,6 +11,8 @@ namespace Volo.Abp.Auditing
public bool IsEnabledForAnonymousUsers { get; set; } public bool IsEnabledForAnonymousUsers { get; set; }
public List<IAuditInfoContributor> Contributors { get; }
public List<Type> IgnoredTypes { get; } public List<Type> IgnoredTypes { get; }
public AuditingOptions() public AuditingOptions()
@ -18,6 +20,11 @@ namespace Volo.Abp.Auditing
IsEnabled = true; IsEnabled = true;
IsEnabledForAnonymousUsers = true; IsEnabledForAnonymousUsers = true;
Contributors = new List<IAuditInfoContributor>
{
new ClientInfoAuditInfoContributor()
};
IgnoredTypes = new List<Type> IgnoredTypes = new List<Type>
{ {
typeof(Stream), typeof(Stream),

31
framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/ClientInfoAuditInfoContributor.cs

@ -0,0 +1,31 @@
using System;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
namespace Volo.Abp.Auditing
{
public class ClientInfoAuditInfoContributor : IAuditInfoContributor
{
public Task Contribute(IAuditInfoContributionContext context)
{
var clientInfoProvider = context.ServiceProvider.GetRequiredService<IClientInfoProvider>();
if (context.AuditInfo.ClientIpAddress.IsNullOrEmpty())
{
context.AuditInfo.ClientIpAddress = clientInfoProvider.ClientIpAddress;
}
if (context.AuditInfo.BrowserInfo.IsNullOrEmpty())
{
context.AuditInfo.BrowserInfo = clientInfoProvider.BrowserInfo;
}
if (context.AuditInfo.ClientName.IsNullOrEmpty())
{
context.AuditInfo.ClientName = clientInfoProvider.ComputerName;
}
return Task.CompletedTask;
}
}
}

38
framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/DefaultAuditInfoProvider.cs

@ -1,38 +0,0 @@
using System;
using Volo.Abp.DependencyInjection;
namespace Volo.Abp.Auditing
{
//TODO: Implement as multiple providers can contribute!
/// <summary>
/// Default implementation of <see cref="IAuditInfoProvider" />.
/// </summary>
public class DefaultAuditInfoProvider : IAuditInfoProvider, ITransientDependency
{
protected IClientInfoProvider ClientInfoProvider { get; }
public DefaultAuditInfoProvider(IClientInfoProvider clientInfoProvider)
{
ClientInfoProvider = clientInfoProvider;
}
public virtual void Fill(AuditInfo auditInfo)
{
if (auditInfo.ClientIpAddress.IsNullOrEmpty())
{
auditInfo.ClientIpAddress = ClientInfoProvider.ClientIpAddress;
}
if (auditInfo.BrowserInfo.IsNullOrEmpty())
{
auditInfo.BrowserInfo = ClientInfoProvider.BrowserInfo;
}
if (auditInfo.ClientName.IsNullOrEmpty())
{
auditInfo.ClientName = ClientInfoProvider.ComputerName;
}
}
}
}

9
framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/IAuditInfoContributionContext.cs

@ -0,0 +1,9 @@
using Volo.Abp.DependencyInjection;
namespace Volo.Abp.Auditing
{
public interface IAuditInfoContributionContext : IServiceProviderAccessor
{
AuditInfo AuditInfo { get; set; }
}
}

9
framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/IAuditInfoContributor.cs

@ -0,0 +1,9 @@
using System.Threading.Tasks;
namespace Volo.Abp.Auditing
{
public interface IAuditInfoContributor
{
Task Contribute(IAuditInfoContributionContext context);
}
}

14
framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/IAuditInfoProvider.cs

@ -1,14 +0,0 @@
namespace Volo.Abp.Auditing
{
/// <summary>
/// Provides an interface to provide audit informations in the upper layers.
/// </summary>
public interface IAuditInfoProvider
{
/// <summary>
/// Called to fill needed properties.
/// </summary>
/// <param name="auditInfo">Audit info that is partially filled</param>
void Fill(AuditInfo auditInfo);
}
}
Loading…
Cancel
Save