【问题标题】:How to design a User Object Model using MS Roles & Membership如何使用 MS Roles & Membership 设计用户对象模型
【发布时间】:2015-04-19 06:49:43
【问题描述】:

我想为一个有点典型的 Web 应用程序构建一个“用户”对象模型……但是我无法决定如何最好地设计对象模型和角色系统。

基本上我计划拥有大约 4 种用户类型……它们将对应于会员提供商中的用户“角色”。

这些类型将是: • 工人 • 雇主 • 来宾 • 管理员

超类型是: • 用户

此外,用户有时可能既是“工人”又是“雇主”。

我想使用 MS Roles & Membership 提供程序并设置导航 UI 以响应用户角色。

我的问题是: 我怎样才能最好地将这些用户设计为灵活(用户可以是工人和雇主)。 如何处理登录/角色程序?

(我正在考虑一个具有“行为”对象工厂的用户(工人行为,雇主行为))

对于 Login-User 登录 ... 找到它的角色并转换到它的子类型。

这是应该怎么做的吗?

【问题讨论】:

    标签: object model asp.net-membership


    【解决方案1】:

    事实证明,仅使用角色概念本身对我来说已经足够了。它没有提供足够低的粒度来控制权限。例如,您可能有一个工人角色和一个管理员角色,然后在代码中您使用 principal.IsInRole("Admin") 来检查他们的角色以确定他们是否可以修改某些值(比如薪水)。然后有人改变了主意,说主管可以改变薪水,但仍然不是管理员。现在您必须更改您的访问检查以添加另一个角色检查。痛苦而例行公事。

    所以我要做的是列出应用程序中的所有功能,然后让它们与数据库中的所有角色相关联。我的访问检查看起来像 principal.HasPermission("CHANGESALARY")。我根据用户登录时所附加的角色加载用户权限。这样,企业可以创建他们想要的任意数量的功能组并为其命名。然后可以将它们应用于任何用户。

    我创建了一个自定义主体对象并将其附加到线程,以便我可以在整个页面生命周期的任何代码中使用它。该对象具有从数据库加载权限的代码和权限检查的方法。

    我通常发现框架中的“提供者”适用于一小部分应用程序,但无法满足大多数需求。等到你完全按照自己的意愿来写它们时,从头开始写会更容易。

    【讨论】:

      【解决方案2】:

      说实话,这可能不是一个很好的解决方案,但它可能有助于产生其他一些想法。

      我的角色是所有可能的权限组合:

      Worker, Employee, Guest, Admin, WorkerEmployee, etc
      

      在我的代码中,我有一个单独权限的枚举

      [Flags]
      public enum RolePermissions
      {
          Guest = 1,
          Worker = 2,
          Employee = 4,
          Admin = 8
      }
      

      我有一个与数据库中的角色相对应的枚举。整数值是权限的按位或:

      public enum AvailableRoles
      {
          None = 0,
          Guest = RolePermissions.Guest, //1
          Worker = RolePermissions.Worker, // 2
          Employee = RolePermissions.Employee, // 4
          WorkerEmployee = RolePermissions.Worker | RolePermissions.Employee, // 6
          Admin = RolePermissions.Admin, // 8
      }
      

      然后有一组方法可以用来查找权限等等:

      // Used to determine if the currently logged in user has a particular permission (Guest, Worker, Employee, Admin)
      public static bool UserHasPermission( RolePermissions rolePermssion )
      {
          foreach( string role in Roles.GetRolesForUser() )
          {
              AvailableRoles availableRole = Parse( role );
      
              if( ( (RolePermissions)availableRole & rolePermssion ) == rolePermssion )
                  return true;
          }
      
          return false;
      }
      
      // Used to determine whether the currently logged in user is in a specific role
      public static bool UserIsInRole( AvailableRoles requestedRole )
      {
          return UserIsInRole( Membership.GetUser().UserName, requestedRole );
      }
      
      // Used to determine whether a specific user is in a specific role
      public static bool UserIsInRole( string username, AvailableRoles requestedRole )
      {
          foreach( string role in Roles.GetRolesForUser( username ) )
          {
              AvailableRoles actualRole = Parse( role );
      
              if( actualRole == requestedRole )
                  return true;
          }
      
          return false;
      }
      
      // Helper method to parse enum
      private static AvailableRoles Parse( string role )
      {
          return (AvailableRoles)Enum.Parse( typeof( AvailableRoles ), role );
      }
      

      如果您想出更好的方法或进行改进,请告诉我,以便我将其重新合并到我自己的代码中。 :-)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-01
        • 2021-06-14
        • 2020-01-08
        • 1970-01-01
        相关资源
        最近更新 更多