【问题标题】:Return a subset of data based on current user role (MVC4)根据当前用户角色返回数据子集(MVC4)
【发布时间】:2014-03-15 14:03:56
【问题描述】:

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

  • 管理员
  • 支持
  • 客户服务
  • 等等……

表格设计如下

[ 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 条件,如果需求发生变化或规则变得更复杂,这将是一场维护噩梦。

有什么好的设计建议可以用更少的硬编码更好地实现这种行为?

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

【问题讨论】:

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


    【解决方案1】:

    你有两个选择:

    1. 规范模式。规范模式在互联网上有很好的描述。 Here 是很好的描述。我倾向于规范,但这并不总是方便。

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

    【讨论】:

    • 谢谢。我会调查他们。
    猜你喜欢
    • 1970-01-01
    • 2013-05-03
    • 1970-01-01
    • 2014-01-17
    • 1970-01-01
    • 2016-03-29
    • 2011-07-06
    • 2017-04-20
    • 1970-01-01
    相关资源
    最近更新 更多