处理许多不同类型的角色和数据检索

Posted

技术标签:

【中文标题】处理许多不同类型的角色和数据检索【英文标题】:Handling many different types of roles and data retrieval 【发布时间】:2016-08-23 21:43:04 【问题描述】:

请注意,我在后端使用 Laravel。假设您在任务管理系统中有 10 个不同的用户级别。所有这些用户级别对任务本身以及每个任务的实际属性都有不同的访问权限。例如,超级管理员可能能够查看所有任务,而经理也可以。但是经理只能看到这些任务的特定属性子集。另一方面,常客只会看到他们自己的任务,以及不同的属性子集。

你会使用什么样的设计模式或方法来处理这样的事情?每个用户级别都不同,我试图避免在任何地方添加 switch 语句。对于简单的事情,完全没问题。但是当它无处不在时,它似乎是一种代码味道。

这基本上就是我试图找到一个好的解决方案的原因。还有其他一些事情,我将数组返回到视图,但根据用户级别,数组将填充不同的信息集。我正在尝试限制发送的数据,即使它没有显示出来,因为我在前面使用了 Angular。因此,检查该数据的响应非常简单。

【问题讨论】:

【参考方案1】:

我会考虑使用类似这个项目的东西:https://github.com/Narzerus/angular-permission

根据文档:

权限通过使用简单的概念让您决定谁可以访问它们,从而帮助您控制自己的路线。我看过很多关于访问控制实现的大型教程,它们可能会让人不知所措。所以我给你带来了一个简单、强大、直接的解决方案。

这是一个关于如何在 Angular 中实现它的简单示例:

定义权限:

angular.module('barModule', ['permission', 'user'])
.run(function (PermissionStore, User, $q) 
  PermissionStore
    // Define user permission calling back-end
    .definePermission('user', function (stateParams) 
      // This time we will return a promise
      // If the promise *resolves* then the user has the permission, if it *rejects* (you guessed it)

      // Let's assume this returns a promise that resolves or rejects if session is active
      return User.checkSession();
    )

  PermissionStore
    // A different example for admin
    .definePermission('admin', function (stateParams) 
      var deferred = $q.defer();

      User.getAccessLevel()
        .then(function (data) 
          if (data.accessLevel === 'admin') 
            deferred.resolve();
           else 
            deferred.reject();
          
        
        .catch(function () 
          // Error with request
          deferred.reject();
        );

      return deferred.promise;
    );
);

定义角色:

angular
.module('fooModule', ['permission', 'user'])
.run(function (RoleStore, User) 
  RoleStore
    // Permission array validated role
    // Library will internally validate if 'user' and 'editor' permissions are valid when checking if role is valid   
    .defineRole('admin', ['user', 'editor']);  

  RoleStore    
    // Server side validated role
    .defineRole('accountant', [], function (stateParams) 
      // Let's assume that we are making a request to server here and return response as promise        
      return User.hasRole('accountant');
    );
);

在路线中的使用:

$stateProvider
.state('dashboard', 
  url: '...',
  data: 
    permissions: 
      except: ['anonymous'],
      redirectTo: 'login'
    
  
);

在视图中的使用:

<div permission only="'loggedIn'">
    <span>Congrats! You are logged in.</span>  
</div>

【讨论】:

以上是关于处理许多不同类型的角色和数据检索的主要内容,如果未能解决你的问题,请参考以下文章

用户、角色、权限和特定组 RBAC?

在 C# 应用程序中处理不同用户角色的推荐方法是啥?

具有不同角色的 Rails Person 模型作为子类

如果用户角色(卖家与买家)有所不同,我该如何构建我的猫鼬模式?

不同角色看行性能

Django:实现多个用户级别/角色/类型