Browse Source

Auditing enhancements.

Added EntityHistorySelectorList option.
Renamed AuditingOptions to AbpAuditingOptions.
Ignored some Identity properties for audit logging.
pull/395/head
Halil ibrahim Kalkan 8 years ago
parent
commit
036df4e837
  1. 4
      framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Auditing/AbpAuditActionFilter.cs
  2. 4
      framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/Auditing/AbpAuditingMiddleware.cs
  3. 8
      framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AbpAuditingOptions.cs
  4. 4
      framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AuditingHelper.cs
  5. 12
      framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/EntityHistorySelectorList.cs
  6. 14
      framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/IEntityHistorySelectorList.cs
  7. 4
      framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/JsonNetAuditSerializer.cs
  8. 31
      framework/src/Volo.Abp.Core/Volo/Abp/NamedTypeSelector.cs
  9. 24
      framework/src/Volo.Abp.Core/Volo/Abp/NamedTypeSelectorListExtensions.cs
  10. 20
      framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Auditing/EntityHistorySelectorListExtensions.cs
  11. 14
      framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/EntityHistory/EntityHistoryHelper.cs
  12. 3
      modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityRole.cs
  13. 6
      modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUser.cs

4
framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Auditing/AbpAuditActionFilter.cs

@ -12,11 +12,11 @@ namespace Volo.Abp.AspNetCore.Mvc.Auditing
{
public class AbpAuditActionFilter : IAsyncActionFilter, ITransientDependency
{
protected AuditingOptions Options { get; }
protected AbpAuditingOptions Options { get; }
private readonly IAuditingHelper _auditingHelper;
private readonly IAuditingManager _auditingManager;
public AbpAuditActionFilter(IOptions<AuditingOptions> options, IAuditingHelper auditingHelper, IAuditingManager auditingManager)
public AbpAuditActionFilter(IOptions<AbpAuditingOptions> options, IAuditingHelper auditingHelper, IAuditingManager auditingManager)
{
Options = options.Value;
_auditingHelper = auditingHelper;

4
framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/Auditing/AbpAuditingMiddleware.cs

@ -11,14 +11,14 @@ namespace Volo.Abp.AspNetCore.Auditing
private readonly RequestDelegate _next;
private readonly IAuditingManager _auditingManager;
protected AuditingOptions Options { get; }
protected AbpAuditingOptions Options { get; }
protected ICurrentUser CurrentUser { get; }
public AbpAuditingMiddleware(
RequestDelegate next,
IAuditingManager auditingManager,
ICurrentUser currentUser,
IOptions<AuditingOptions> options)
IOptions<AbpAuditingOptions> options)
{
_next = next;
_auditingManager = auditingManager;

8
framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AuditingOptions.cs → framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AbpAuditingOptions.cs

@ -5,7 +5,7 @@ using System.Linq.Expressions;
namespace Volo.Abp.Auditing
{
public class AuditingOptions
public class AbpAuditingOptions
{
//TODO: Consider to add an option to disable auditing for application service methods?
@ -23,7 +23,9 @@ namespace Volo.Abp.Auditing
public List<Type> IgnoredTypes { get; }
public AuditingOptions()
public IEntityHistorySelectorList EntityHistorySelectors { get; }
public AbpAuditingOptions()
{
IsEnabled = true;
IsEnabledForAnonymousUsers = true;
@ -38,6 +40,8 @@ namespace Volo.Abp.Auditing
typeof(Stream),
typeof(Expression)
};
EntityHistorySelectors = new EntityHistorySelectorList();
}
}
}

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

@ -19,13 +19,13 @@ namespace Volo.Abp.Auditing
protected ICurrentUser CurrentUser { get; }
protected ICurrentTenant CurrentTenant { get; }
protected IClock Clock { get; }
protected AuditingOptions Options;
protected AbpAuditingOptions Options;
protected IAuditSerializer AuditSerializer;
protected IServiceProvider ServiceProvider;
public AuditingHelper(
IAuditSerializer auditSerializer,
IOptions<AuditingOptions> options,
IOptions<AbpAuditingOptions> options,
ICurrentUser currentUser,
ICurrentTenant currentTenant,
IClock clock,

12
framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/EntityHistorySelectorList.cs

@ -0,0 +1,12 @@
using System.Collections.Generic;
namespace Volo.Abp.Auditing
{
internal class EntityHistorySelectorList : List<NamedTypeSelector>, IEntityHistorySelectorList
{
public bool RemoveByName(string name)
{
return RemoveAll(s => s.Name == name) > 0;
}
}
}

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

@ -0,0 +1,14 @@
using System.Collections.Generic;
namespace Volo.Abp.Auditing
{
public interface IEntityHistorySelectorList : IList<NamedTypeSelector>
{
/// <summary>
/// Removes a selector by name.
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
bool RemoveByName(string name);
}
}

4
framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/JsonNetAuditSerializer.cs

@ -6,9 +6,9 @@ namespace Volo.Abp.Auditing
{
public class JsonNetAuditSerializer : IAuditSerializer, ITransientDependency
{
protected AuditingOptions Options;
protected AbpAuditingOptions Options;
public JsonNetAuditSerializer(IOptions<AuditingOptions> options)
public JsonNetAuditSerializer(IOptions<AbpAuditingOptions> options)
{
Options = options.Value;
}

31
framework/src/Volo.Abp.Core/Volo/Abp/NamedTypeSelector.cs

@ -0,0 +1,31 @@
using System;
namespace Volo.Abp
{
/// <summary>
/// Used to represent a named type selector.
/// </summary>
public class NamedTypeSelector
{
/// <summary>
/// Name of the selector.
/// </summary>
public string Name { get; set; }
/// <summary>
/// Predicate.
/// </summary>
public Func<Type, bool> Predicate { get; set; }
/// <summary>
/// Creates new <see cref="NamedTypeSelector"/> object.
/// </summary>
/// <param name="name">Name</param>
/// <param name="predicate">Predicate</param>
public NamedTypeSelector(string name, Func<Type, bool> predicate)
{
Name = name;
Predicate = predicate;
}
}
}

24
framework/src/Volo.Abp.Core/Volo/Abp/NamedTypeSelectorListExtensions.cs

@ -0,0 +1,24 @@
using System;
using System.Collections.Generic;
using System.Linq;
namespace Volo.Abp
{
public static class NamedTypeSelectorListExtensions
{
/// <summary>
/// Add list of types to the list.
/// </summary>
/// <param name="list">List of NamedTypeSelector items</param>
/// <param name="name">An arbitrary but unique name (can be later used to remove types from the list)</param>
/// <param name="types"></param>
public static void Add(this IList<NamedTypeSelector> list, string name, params Type[] types)
{
Check.NotNull(list, nameof(list));
Check.NotNull(name, nameof(name));
Check.NotNull(types, nameof(types));
list.Add(new NamedTypeSelector(name, type => types.Any(type.IsAssignableFrom)));
}
}
}

20
framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Auditing/EntityHistorySelectorListExtensions.cs

@ -0,0 +1,20 @@
using System.Linq;
using Volo.Abp.Domain.Entities;
namespace Volo.Abp.Auditing
{
public static class EntityHistorySelectorListExtensions
{
public const string AllEntitiesSelectorName = "Abp.Entities.All";
public static void AddAllEntities(this IEntityHistorySelectorList selectors)
{
if (selectors.Any(s => s.Name == AllEntitiesSelectorName))
{
return;
}
selectors.Add(new NamedTypeSelector(AllEntitiesSelectorName, t => typeof(IEntity).IsAssignableFrom(t)));
}
}
}

14
framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/EntityHistory/EntityHistoryHelper.cs

@ -24,19 +24,16 @@ namespace Volo.Abp.EntityFrameworkCore.EntityHistory
protected IAuditingStore AuditingStore { get; }
protected IJsonSerializer JsonSerializer { get; }
protected AuditingOptions Options { get; }
protected AbpAuditingOptions Options { get; }
private readonly IUnitOfWorkManager _unitOfWorkManager;
private readonly IClock _clock;
public EntityHistoryHelper(
IUnitOfWorkManager unitOfWorkManager,
IAuditingStore auditingStore,
IOptions<AuditingOptions> options,
IOptions<AbpAuditingOptions> options,
IClock clock,
IJsonSerializer jsonSerializer)
{
_unitOfWorkManager = unitOfWorkManager;
_clock = clock;
AuditingStore = auditingStore;
JsonSerializer = jsonSerializer;
@ -47,8 +44,6 @@ namespace Volo.Abp.EntityFrameworkCore.EntityHistory
public virtual List<EntityChangeInfo> CreateChangeList(ICollection<EntityEntry> entityEntries)
{
//TODO: Check if auditing disabled (on at somewhere else)?
var list = new List<EntityChangeInfo>();
foreach (var entry in entityEntries)
@ -234,6 +229,11 @@ namespace Volo.Abp.EntityFrameworkCore.EntityHistory
return false;
}
if (Options.EntityHistorySelectors.Any(selector => selector.Predicate(entityType)))
{
return true;
}
var properties = entityEntry.Metadata.GetProperties();
if (properties.Any(p => p.PropertyInfo?.IsDefined(typeof(AuditedAttribute)) ?? false))
{

3
modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityRole.cs

@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Security.Claims;
using JetBrains.Annotations;
using Volo.Abp.Auditing;
using Volo.Abp.Domain.Entities;
using Volo.Abp.Guids;
using Volo.Abp.MultiTenancy;
@ -24,6 +25,7 @@ namespace Volo.Abp.Identity
/// <summary>
/// Gets or sets the normalized name for this role.
/// </summary>
[DisableAuditing]
public virtual string NormalizedName { get; protected internal set; }
/// <summary>
@ -34,6 +36,7 @@ namespace Volo.Abp.Identity
/// <summary>
/// A random value that should change whenever a role is persisted to the store
/// </summary>
[DisableAuditing]
public virtual string ConcurrencyStamp { get; set; }
/// <summary>

6
modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUser.cs

@ -5,6 +5,7 @@ using System.Linq;
using System.Security.Claims;
using JetBrains.Annotations;
using Microsoft.AspNetCore.Identity;
using Volo.Abp.Auditing;
using Volo.Abp.Data;
using Volo.Abp.Domain.Entities;
using Volo.Abp.Guids;
@ -24,6 +25,7 @@ namespace Volo.Abp.Identity
/// <summary>
/// Gets or sets the normalized user name for this user.
/// </summary>
[DisableAuditing]
public virtual string NormalizedUserName { get; protected internal set; }
/// <summary>
@ -34,6 +36,7 @@ namespace Volo.Abp.Identity
/// <summary>
/// Gets or sets the normalized email address for this user.
/// </summary>
[DisableAuditing]
public virtual string NormalizedEmail { get; protected internal set; }
/// <summary>
@ -45,16 +48,19 @@ namespace Volo.Abp.Identity
/// <summary>
/// Gets or sets a salted and hashed representation of the password for this user.
/// </summary>
[DisableAuditing]
public virtual string PasswordHash { get; protected internal set; }
/// <summary>
/// A random value that must change whenever a users credentials change (password changed, login removed)
/// </summary>
[DisableAuditing]
public virtual string SecurityStamp { get; protected internal set; }
/// <summary>
/// A random value that must change whenever a user is persisted to the store
/// </summary>
[DisableAuditing]
public virtual string ConcurrencyStamp { get; set; }
/// <summary>

Loading…
Cancel
Save