发布
社区首页 >问答首页 >在处理管理系统用户和前端网站用户时如何处理用户权限?

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

Stack Overflow用户
提问于 2011-09-21 09:10:23
回答 1查看 1.8K关注 0票数 5

有人能推荐一个信息源或工作示例,说明在同时处理管理系统用户和网站用户时如何处理访问权限吗?

目前,我们的代码有点像一个大版本的在线商店,有几个工作人员使用管理系统管理订单,任何数量的客户都在使用该网站。管理系统是建立在一个访问控制列表(如LiveUser),但有一个相当大的‘创可贴’持有与一个‘虚拟’用户承担所有网站用户(所有客户)的角色。

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

理想情况下,我们希望扩展该系统,这样我们就可以让某些注册客户在没有足够库存或支付的情况下下订单,只需生成发票和积压订单即可。这将是至少两个客户的“角色”,除了许多工作人员的角色.

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

我们在应用程序中使用php & MySQL,但欢迎使用任何其他语言模式。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-09-22 19:51:35

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

我最近的尝试是这样的:

  1. 每个用户都附加了一个权限对象。在我的例子中,当用户被请求时自动创建。(在我的示例中,不同部分的权限可能不同。因此,用户可能被允许为Y做X,但不允许做Z)
  2. 每个页面、代码块或需要允许的视图都用一个检查权限对象的if语句包装。如果该权限也需要担心该部分,则将当前相关的节If作为数组传入,返回一个新的bools数组来匹配。然后,
  3. 接口不会直接向用户公开这种复杂的混乱情况,相反,超级管理界面允许创建新的用户类型。这些类型带有一组权限,这些权限将为该用户的“类型”启用。不同类型的权限可能有重叠,因此Admin和Editor都可以“编辑副本”或其他什么。
  4. 普通的管理界面允许将单个用户设置为不同部分的不同用户类型。因此,一个用户可能是第2节的管理员,以及第2、3、4和5节的编辑器。它们也可以全局设置,从而重载未使用的部分(0)。

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

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

代码语言:javascript
代码运行次数:0
复制
if($current_user->permissions->can("View Sales Records"))
{
    //Code to view sales records
}

或者稍微复杂一些

代码语言:javascript
代码运行次数:0
复制
$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
    }
}

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

最后,权限对象还包含用户类型的列表。这使得显示用户列表和他们拥有哪些权限变得非常容易。在我的例子中,我们只使用->types()来访问列表中的ids => names数组。

不存在的权限标题被忽略了。它们还匹配小写,删除空格和特殊字符,以帮助减少键入错误的问题。我甚至考虑过做一个距离检查和挑选最接近的匹配。但最终,最好不要依赖这样的东西。(可能记录错误,但优雅地选择最近的匹配。)

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

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

我只希望我能和你分享真正的密码。我只是不拥有它自己,因此不能发布它。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7497296

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档