我们如何在框架内将用户限制为他们自己的实体?我知道我们可以检查会话 ID 或在 LINQ 查询中包含 currentSession,但我有点想知道框架是否提供了一种更好更有效的方法来克服这个问题?
问问题
157 次
2 回答
0
我在旧论坛上给出了一个示例,说明如何手动创建一个名为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);
}
}
}
于 2017-07-06T06:50:04.133 回答
0
如果多租户支持
Salesforce.com 使用 OrganizationId 的概念。缺点是一个给定的电子邮件地址不能在多个组织中用于登录。
因此,每当用户添加项目或其他任何内容时,记录都会包含他们的 OrganizaionId。然后其他用户将仅限于具有其 OrganizationId 的项目。
如果只是用户创建的记录
在您的主表中包含一个名为“所有者”的列,并使用他们的用户名填充该列。
于 2017-07-06T01:18:05.527 回答