根据当前用户角色返回数据子集(MVC4)

时间:2014-02-16 09:20:32

标签: asp.net-mvc design-patterns user-roles

我有一个Departments表,它的数据如下。

  • 管理
  • 支持
  • 客户服务
  • 等...

该表的设计如下

[ ID | User Name | Department | IsActive | ...]

当我查询此表时,我想从数据库返回的内容取决于当前登录用户的部门。

  • 管理员可以查看所有
  • 支持无法查看管理员,但可以查看其他所有内容
  • 客户服务无法查看支持或管理员,但不能查看以下所有内容。

如果这个数据库设计不够,那么请建议我一个好的设计。

到目前为止我实施的是

var accountRepository = DataRepositoryFactory.GetDataRepository<IAccountRepository>();

  var accounts = accountRepository.Get() as List<UserManagement>;

  if (accounts != null)
   {
      if (AuthorizationAccount.Department == (SecurityConstants.RoleSuperAdministrator))
            return accounts.ToArray();
      else if (AuthorizationAccount.Department == (SecurityConstants.RoleAdministrator))
            return accounts.Where(r => !r.Department.Equals(SecurityConstants.RoleSuperAdministrator)).ToArray();
      else if (AuthorizationAccount.Department != (SecurityConstants.RoleAdministrator)
            || AuthorizationAccount.Department != (SecurityConstants.RoleSuperAdministrator))
            return accounts.Where(r => !r.Department.Equals(SecurityConstants.RoleSuperAdministrator))
                .Where(r => !r.Department.Equals(SecurityConstants.RoleAdministrator)).ToArray();
                }

  return null;

我不喜欢拥有如此多的IF条件,如果需求发生变化或者规则变得更加复杂,那就是维护噩梦。

使用较少的硬编码可以更好地实现此行为的优秀设计建议是什么?

是否有任何设计模式可以解决此类问题?

1 个答案:

答案 0 :(得分:2)

您有两个选择:

  1. 规格图案。规范模式在互联网上很好地描述。 Here是很好的描述。我赞成规范,但这并不总是方便。

  2. 过滤掉DbContext级别的数据(假设使用了Entity Framework)。 Head here代码和解释如何实现这一点。这适用于低级别的全局过滤,因此您甚至不必在存储库中考虑它。但是这会在db-code和UI-code之间增加不必要的耦合。还会增加复杂性并增加调试问题。如果除了MVC项目之外没有在其他地方使用DbContext,请使用此方法。