将用户限制为他们自己的实体

时间:2017-07-06 00:11:50

标签: asp.net aspnetboilerplate

我们如何在框架内限制用户使用自己的实体?我知道我们可以检查会话ID或在LINQ查询中包含currentSession但我有点想知道框架是否提供了一种更好,更有效的方法来克服这个问题?

2 个答案:

答案 0 :(得分:0)

如果是多租户支持

Salesforce.com使用OrganizationId的概念。缺点是给定的电子邮件地址不能在多个组织中用于登录。

因此,无论何时用户添加项目或其他任何内容,该记录都将包含其OrganizaionId。然后,其他用户将仅限于具有其OrganizationId的项目。

如果只是用户创建了记录

在主表中包含一个名为“所有者”的列,并使用其用户名填充该列。

答案 1 :(得分:0)

我举例说明了old forums如何手动创建一个名为 IMustOwnEntity 的接口,并将其添加到实体中,以及 IRepository 的扩展方法它使用接口来控制访问。

为您的域实体创建一个空接口以继承。然后创建一个扩展方法并重载Update以获取实体和用户ID(您从AbpSession或其他任何方式传递)。该方法必须检查实体是否实现了您的接口,然后在更新之前检查传递的用户是否是实体的创建者,否则它只是正常更新实体。如果用户不是所有者,您必须决定该怎么做;在我下面的例子中,我只是抛出异常。

<强>接口

public interface IMustOwnEntity
{
}

扩展类

public static class RepositoryExtensions
{
  public static TEntity Update<TEntity>(this IRepository<TEntity> repository, TEntity entity, long userId) where TEntity : class, IEntity<int>, ICreationAudited
  {
    if (entity is IMustOwnEntity)
    {
      var exists = repository.FirstOrDefaultAsync((record) => record.Id == entity.Id && record.CreatorUserId == userId);

      if (exists != null)
      {
          return repository.Update(entity);
      }
      else
      {
          throw new Exception("Record does not belong to user");
      }
    }
    else
    {
      return repository.Update(entity);
    }
  }
}