代码之家  ›  专栏  ›  技术社区  ›  Romesh D. Niriella

返回基于当前用户角色的数据子集(MVC4)

  •  1
  • Romesh D. Niriella  · 技术社区  · 12 年前

    我有一张部门表,数据如下。

    • 管理
    • 支持
    • 客户关怀
    • 等

    该表设计如下

    [ 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 回复  |  直到 12 年前
        1
  •  2
  •   trailmax    12 年前

    您有两个选项:

    1. 规范模式。规范模式在互联网上得到了很好的描述。 Here 这是一个很好的描述。我喜欢规范,但这并不总是方便的。

    2. 过滤掉DbContext级别的数据(假设使用了实体框架)。 Head here 获取代码并解释如何实现此功能。这将在低级别应用全局过滤,因此您甚至不必在存储库中考虑它。但这会在db代码和UI代码之间增加不必要的耦合。还增加了复杂性并增加了调试问题。如果DbContext未在MVC项目以外的其他地方使用,请使用此选项。