处理管理系统用户和前端网站用户时如何处理用户权限?

Ben*_*dos 5 php acl authorization web-applications

任何人都可以推荐信息来源或工作示例,说明在与管理系统用户和网站用户同时处理时如何处理访问权限?

我们的代码目前有点像在线商店的大版本,有几名员工使用管理系统管理订单,以及使用该网站的任意数量的客户.管理系统是围绕一个访问控制列表(如LiveUser)构建的,但有一个相当大的"创可贴",与一个"虚拟"用户一起担任所有网站用户(所有客户)的角色.

理想情况下,应用程序代码将使用类似的短语can_place_order()来确定用户是否可以执行任务.只要库存水平至少与订单数量一样多,并且他们已经对订单的价值进行支付,客户就可以下订单.只要具有"customer_services"角色,管理员用户就可以下订单.

理想情况下,我们希望扩展系统,以便我们可以让某些注册客户在没有足够库存或支付的情况下下订单,只需生成发票和延期交货.除了许多员工的角色之外,这至少会有两个客户"角色"......

  • 如何使用具有两个单独用户列表的相同权限系统?
  • 或者,如何将明显的两组用户合并为一个列表?

我们使用php和MySQL作为应用程序,但欢迎任何其他语言模式.

Dam*_*S8N 4

我尝试了很多不同的权限方案,但我只找到了一种方法来使它们在几乎所有情况下都能满足程序员和客户的需求。这是为了使它们部分由数据驱动。

我最近的尝试是这样的:

  1. 每个用户都附加了一个权限对象。就我而言,当用户被请求时自动创建。(就我而言,不同部分的权限可能不同。因此,用户可能被允许对 Y 执行 X,但不能对 Z 执行操作。)
  2. 每个需要许可的页面、代码块或视图都用检查权限对象的 if 语句包装。如果该权限也需要担心该部分,则当前相关的部分 id 将作为数组传入,返回一个新的布尔数组以进行匹配。
  3. 然后,该界面不会直接向用户暴露这种复杂的混乱,而是使用超级管理界面来创建新的用户类型。这些类型携带将为该“类型”的用户启用的权限集。不同类型的权限可能会重叠,因此管理员和编辑者都可以“编辑副本”或其他任何内容。
  4. 普通的管理界面允许将各个用户设置为不同部分的不同用户类型。因此,一个用户可能是第 2 部分的管理员,也是第 2、3、4 和 5 部分的编辑者。它们也可以全局设置,从而重载未使用的部分 (0)。

这有很多好处和一个缺点。首先,缺点。由于这些密钥直接写入代码中,因此只有超级管理员(又称开发人员)才有权访问界面的该部分。事实上,可能根本不需要接口,因为权限列表只应随代码而变化。这里真正的问题是,在运行代码之前,您不会知道标题有什么问题,因为语法就很好。现在,如果这是用 C# 之类的代码编写的,这将是一个非常严重的问题。但 PHP 中的几乎所有内容都不是类型安全的,因此它实际上只是课程的标准内容。这些值也可以从配置文件加载,甚至可以烘焙到您构建用户类型的 GUI 中,尽管这似乎是错误的。

您从中获得的是能够动态设置新的权限类型。您可以相对轻松地重命名这些权限。(由于系统只使用数字,因此标题仅用于捕获数字,因此可以在几个地方轻松更改。)而且代码使用起来非常简单。它看起来像这样:

if($current_user->permissions->can("View Sales Records"))
{
    //Code to view sales records
}
Run Code Online (Sandbox Code Playgroud)

或者稍微复杂一点

$sections = array(1,2,3,4); //Probably really a list of all sections in the system
$section_permissions = $current_user->permissions->these($sections)->can("Edit Section");
foreach($sections as $s)
{
    if($section_permissions[$s])
    {
        // Code for maybe displaying a list of sections to edit or something
    }
}
Run Code Online (Sandbox Code Playgroud)

方法链接也非常简单。->these()将内部数组设置为这些值,然后返回对对象本身的引用。->can()然后对该列表进行操作(如果存在),然后取消设置它。在我自己的版本中,我也有->any()它总是返回完整的部分列表,因此我可以检查->any()->can().

最后,权限对象还包含用户类型的列表。这使得显示用户列表以及他们拥有哪些活动权限变得非常容易。就我而言,我们只是用来->types()访问该列表的数组ids => names

不存在的权限标题将被简单地忽略。它们还以小写形式进行匹配,并删除空格和特殊字符,以帮助减少打字错误的问题。我什至考虑过进行编辑距离检查并选择最接近的匹配。但最终最好不要依赖类似的东西。(也许会记录错误,但请优雅地选择最接近的匹配项。)

在代码之外和界面中,用户只需要以管理员、编辑、发布者、作家和首席执行官等方式相互关联。为不同的组织创建不同的用户类型集也很简单。

所有部分都可以被大量缓存,为根本没有登录的人设置一个基本用户非常容易,而且我还没有遇到基于权限的问题,使用这个解决方案并不明显结构。

我只希望能与您分享实际的代码。我自己不拥有它,因此无法发布它。