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