有人能推荐一个信息源或工作示例,说明在同时处理管理系统用户和网站用户时如何处理访问权限吗?
目前,我们的代码有点像一个大版本的在线商店,有几个工作人员使用管理系统管理订单,任何数量的客户都在使用该网站。管理系统是建立在一个访问控制列表(如LiveUser),但有一个相当大的‘创可贴’持有与一个‘虚拟’用户承担所有网站用户(所有客户)的角色。
理想情况下,应用程序代码将使用像can_place_order()
这样的短语来确定用户是否可以执行任务。一个客户可以下一个订单,只要库存水平至少与订单数量一样多,并且他们已经支付了订单的价值。管理员用户只要有'customer_services‘角色,就可以下订单。
理想情况下,我们希望扩展该系统,这样我们就可以让某些注册客户在没有足够库存或支付的情况下下订单,只需生成发票和积压订单即可。这将是至少两个客户的“角色”,除了许多工作人员的角色.
我们在应用程序中使用php & MySQL,但欢迎使用任何其他语言模式。
发布于 2011-09-22 19:51:35
我尝试过许多不同的权限方案,而且我只找到了一种方法,使它们在几乎所有情况下都能满足程序员和客户端的要求。这是为了使他们部分数据驱动。
我最近的尝试是这样的:
这有许多好处和一个缺点。首先是缺点。因为这些键是直接放入代码中的,所以只有超级管理员(又名开发人员)才能访问接口的这一部分。实际上,可能根本不需要接口,因为权限列表应该只随代码更改。这里真正的问题是,在运行代码之前,您不会知道标题有什么问题,因为语法会很好。现在,如果这是用类似于C#的代码编写的,这将是一个非常严重的问题。但是PHP中的几乎所有东西都不是类型安全的,因此它实际上是相当正常的。这些值也可以从一个配置文件中加载,甚至可以放入您构建用户类型的GUI中,尽管这似乎是错误的。
您从中获得的是动态设置新权限类型的能力。您可以相对容易地重命名这些权限。(由于系统只使用数字,标题只用于捕获数字,因此可以在几个地方轻松更改。)代码使用起来非常简单。看起来会是这样的:
if($current_user->permissions->can("View Sales Records"))
{
//Code to view sales records
}
或者稍微复杂一些
$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
数组。
不存在的权限标题被忽略了。它们还匹配小写,删除空格和特殊字符,以帮助减少键入错误的问题。我甚至考虑过做一个距离检查和挑选最接近的匹配。但最终,最好不要依赖这样的东西。(可能记录错误,但优雅地选择最近的匹配。)
在代码和界面之外,用户只需要在管理员、编辑、出版者、作家和首席执行官等方面相互关联。为不同的组织创建不同的用户类型集也很简单。
所有这些部分都可以大量缓存,为那些根本没有登录的人设置一个基本用户是非常容易的,而且我还没有遇到一个基于权限的问题,这个问题在使用这种结构时并不明显。
我只希望我能和你分享真正的密码。我只是不拥有它自己,因此不能发布它。
https://stackoverflow.com/questions/7497296
复制相似问题