我有两个实体的应用程序:
public class Employer {
public string Title {get;set;}
public virtual ICollection<Application> Applications {get;set;}
}
public class Application {
public string Title {get;set;}
}
我想让用户访问特定雇主(雇主可以拥有多个用户),这样他们就可以为雇主提交申请。这还包括“你的”雇主的观点。 为了解决这个问题,我想到了以下两种可能性:
创建雇主时,还会创建相应的角色。然后可以将用户添加到此角色,我将编写一些自定义逻辑来检查用户是否处于相应的角色。这里的难点在于,似乎很难以任何安全的方式将角色与雇主联系起来(没有写我自己的角色提供者)
向Employer类添加诸如Collection of Users之类的属性,并检查当前已登录用户是否在此集合中以确定用户是否具有访问权限。
这些是好的解决方案,还是有更好的方法来解决我的问题?
答案 0 :(得分:1)
这是DAO(数据访问对象)的问题,今天没有使用实体框架(mvc 5和asp.net标识的标准)自动执行此操作的方法。
一些建议:
1)它易于创建或覆盖,并使用“RoleManager”和“UserManager”与您自己的规则。
2)您可以使用代理或包装器之类的东西来封装数据访问,以从实体框架中获取数据
你肯定无法克服的唯一一件事(如果你想使用)是“自定义映射”,我的意思是...... Employer的集合属性总是会根据映射配置加载数据,映射配置有点受限(不支持自定义子句,如关系中的位置)。
答案 1 :(得分:0)
我不会为此使用角色。角色通常用于控制对功能的访问,通常不是数据子集(尽管有例外)。
现在,您可能会遇到一些问题,即您拥有由多家公司雇佣的员工,并且他们对每家公司拥有不同的权限。在这种情况下,默认角色提供程序不适合该作业。
但是,如果用户都具有相同的功能,但他们只能访问不同的数据子集,那么解决方案是根据公司过滤您的数据。例如,公司实体将拥有Employees集合。任何其他数据都将与公司挂钩。然后,当您显示或编辑数据时,请确保使用条件查询数据属于当前用户的公司。一般来说,最好在sql(或ef)查询中执行此操作,而不是在应用程序中的代码中执行此操作。