【问题标题】:Suggest design pattern for an application having different user roles为具有不同用户角色的应用程序建议设计模式
【发布时间】:2019-03-16 02:24:40
【问题描述】:

您能否建议我哪种设计模式可用于具有不同用户角色的应用程序(Web 应用程序)。我的应用程序有 Admin、HR、Managers、Assistant Managers 和 Staffs

管理员有权访问网络应用程序中的每个页面 HR 只能访问少数页面,例如第 1 页和第 2 页(请注意,管理员将来可以将特权添加到更多页面) 经理 - 经理可以在那里查看对应的员工

是否有任何设计模式可以实现上述功能。由于将来可以添加更多用户角色和页面

谢谢

【问题讨论】:

    标签: design-patterns


    【解决方案1】:

    通常,在设计用户角色时,Decorator Pattern 是合适的解决方案。

    【讨论】:

      【解决方案2】:

      好吧,我知道这是一篇旧帖子。但这是我为类似的东西设计的,你可以拥有任意数量的角色。最初,每个用户在登录后都是访问者,他们可以拥有任何用户角色。我为此使用了装饰器模式。

      另外我添加了数据库和通信接口。 (大多数网络应用程序都需要这个)我使用了策略设计模式,因此用户可以拥有各种数据库类(Mysql,MsSql)和各种通信方式(Email,SMS)。同样,您可以添加自己的支付接口来处理各种类型的支付选项。

      【讨论】:

        【解决方案3】:

        如果您在页面级别阻止访问,您将在一个或另一个安全框架(如 spring security)中找到您需要的一切。

        如果您希望能够锁定对某些功能的访问,有一些选项。

        对于大多数这些选项,最好不要使用角色,而是使用权限。一个角色可以拥有多个权限。这提供了很大的灵活性。

        你可以看看some MVC derivations。那里的控制器上的方法可以得到保护。您可以将每个功能映射到一个权限。

        如果您将此与command pattern 结合使用,您可以在此级别添加安全性,然后权限将一对一映射到命令。有了这个,让 UI 控件反映当前用户的权限变得非常容易。 (see Actions in Delphi and Spring)

        这最后一个选项对我来说是最漂亮和用户友好的。

        【讨论】:

          【解决方案4】:

          我知道这是一篇非常古老的帖子,但我一直在寻找相同的答案,但从未找到可接受的答案。装饰者模式一开始似乎是最明显的,但这并不是我真正想要的,因为所有角色都必须实现相同的方法(我们是否真的希望客户拥有 BlockUserAccount() 方法,即使它不这样做什么?),并且每次实施新行为时都必须扩展每个角色。

          相反,我通过实验发现委托模式的变体似乎是最好的。我说“变体”是因为我所读到的关于委托模式的所有内容都涉及主对象的超类,但这不是我最终要做的。

          我所做的是使用一个基本的用户对象,它包含一组角色。这些角色被定义为完全不同类型的类,每个都有自己的方法,每个都有自己的接口。然后根据需要委派角色。

          public interface ICustomerAlaCarte 
          {
              void AuthorizePayment(decimal paymentAmount); 
          }
          
          public abstract class UserRole { }
          
          public class CustomerAlaCarte : UserRole, ICustomerAlaCarte 
          {
              public void AuthorizePayment(decimal paymentAmount) 
              {
                  // Logic here
              } 
          }
          
          public class User
          {
              private List<UserRole> _userRoles;
          
              public void AddUserRole(UserRole newRole)
              {
                  _userRoles.Add(newRole);
              }
          
              public ICustomerAlaCarte AsAlaCarteCustomer()
              {
                  ICustomerAlaCarte alaCarteRole = _userRoles.OfType<ICustomerAlaCarte>().FirstOrDefault();
          
                  if (alaCarteRole != null)
                  {
                      return alaCarteRole;
                  }
                  else
                  {
                      throw new UserRoleNotAssignedException(); // Custom exception
                  }
              }
          }
          

          然后使用:

          var user = new User();
          user.AddUserRole(new CustomerAlaCarte());
          
          ICustomerAlaCarte customer = user.AsAlaCarteCustomer();
          customer.AuthorizePayment(9.99);
          

          使用这种模式,您甚至可以拥有嵌套角色。例如,您可以有一个用户 admin 和一个报表管理员,并且每个都将从 Admin 继承。当您只需要基本的管理员功能(或身份)时,您可以拉取一个管理员委托,但您也可以为上述 BlockUserAccount() 行为指定 IUserAdmin,因为每个角色只有对其有意义的方法。

          【讨论】:

            猜你喜欢
            • 2016-07-01
            • 1970-01-01
            • 1970-01-01
            • 2014-08-19
            • 2011-02-19
            • 2015-11-15
            • 2017-04-01
            • 2014-04-30
            • 1970-01-01
            相关资源
            最近更新 更多