Skip to content

Instantly share code, notes, and snippets.

@pofider
Created March 22, 2015 16:49
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save pofider/63ca11bbc1eb3c1d43a2 to your computer and use it in GitHub Desktop.
Save pofider/63ca11bbc1eb3c1d43a2 to your computer and use it in GitHub Desktop.
NHibernate listener assuring that logged in user cannot reach data from other tenants
public class MultitenantAssuranceListener : IPostLoadEventListener, IPreUpdateEventListener, IPreInsertEventListener, IPreDeleteEventListener
{
public void OnPostLoad(PostLoadEvent @event)
{
if (@event.Entity is IHaveTenant)
{
var tenantId = ((IHaveTenant)@event.Entity).TenantId;
if (Scope.CurrentTenant.Id != tenantId)
throw new InvalidOperationException("Ilegal data access.");
}
}
public bool OnPreUpdate(PreUpdateEvent @event)
{
if (@event.Entity is IHaveTenant)
{
var state = @event.OldState ?? @event.State;
var tenantId = (Account)state.GetValue(Array.IndexOf(@event.Persister.PropertyNames, "TenantId"));
if (Scope.CurrentTenant.Id != tenantId)
throw new InvalidOperationException("Ilegal data access.");
}
return false;
}
public bool OnPreInsert(PreInsertEvent @event)
{
if (@event.Entity is IHaveTenant)
{
if (Scope.CurrentTenant.Id != ((IHaveTenant)@event.Enttiy).TenantId)
throw new InvalidOperationException("Ilegal data access.");
}
return false;
}
public bool OnPreDelete(PreDeleteEvent @event)
{
if (@event.Entity is IHaveTenant)
{
if (Scope.CurrentTenant.Id != ((IHaveTenant)@event.Enttiy).TenantId)
throw new InvalidOperationException("Ilegal data access.");
}
return false;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment