[英]User Access Levels on PHP
我是php的新手,目前正在创建一个电子商务网站。 我已经为管理员创建了CMS后端,以添加/编辑/删除产品,管理订单,管理商店配置以及添加/编辑/删除用户。
我在找出如何设置用户权限/访问权限时遇到了麻烦,因此:-普通人员只能访问管理订单,并且-管理人员可以访问所有内容
因此,基本上给用户一个角色,将赋予他们限制或完全访问所有内容的权限。
是否有任何教程或具有添加此功能的经验的人可以为我指明正确的方向?
任何帮助将不胜感激。 谢谢
@Johnathan建议的替代设计是user
HAS_MANY roles
和每个role
HAS_MANY permissions
。
Users:
+ id
+ name
Roles:
+ id
+ name
Permissions:
+ id
+ name
然后,将用户链接到他们的每个角色(以及将角色链接到他们的每个权限),如下所示:
RolesUsers:
+ id
+ role_id /* Associate a Role to a User */
+ user_id /* Associate a User to a Role */
RolePermissions:
+ id
+ role_id /* Associate a Role to a Permission */
+ permission_id /* Associate a Permission to a Role */
除了级联角色,或仅允许用户处于单个角色之外,具有多个角色的用户可提供最大的灵活性。
权限与角色关联,而用户与角色关联。 毫无疑问,有很多方法可以实现这种类型的系统,但是下面是一个快速的概念,您可以从中开始思考:
Users:
+ userid
+ roleid /* Associate a Role to a User */
Roles:
+ roleid
+ rolename
Permissions:
+ permissionid
+ permissionname
RolePermissions:
+ roleid
+ permissionid /* Associate a Permission to a Role */
请注意第一个表中的角色是如何直接从用户表中关联的。 如果要为用户分配多个角色,可以将其分解并放在自己的表中。
一旦完成所有操作或类似操作,您就可以通过会话变量跟踪用户的角色,并通过查找该操作的ID /名称来确定是否允许该用户执行任何给定的操作,并且RolePermissions表中其角色的ID /名称。
if ( $user->allowed( 'deleteUser' ) ) {
$users->remove( $uid );
}
当然,数据库方面只是工作的第一部分。 接下来,您将需要实现数据库与代码之间的连接。
有几种方法可以完成此操作,这取决于您的应用程序将如何增长。 如果您确定只有两个配置文件,则只需在“用户”表中添加一个“配置文件”字段即可。
我想您已经实现了登录管理,那么您可能会将已记录的用户ID保留在会话中。 只需保留配置文件类型,并且每次您显示一些只应由管理员访问的组件时,都将其包装
<?php if ($_SESSION['logged_user_profile'] == 'manager'): ?>
<!-- display your thing here -->
<?php endif; ?>
请注意,这只会隐藏元素。 您还必须在代码中的所有位置执行此检查,以防止执行相应的操作...
例如,如果使用诸如CodeIgniter之类的MVC框架,更好的方法是通过访问控制器钩住所有请求,如果用户尝试访问不允许访问的内容,则将用户重定向到“禁止访问”页面。 这样,您的访问权限仅在一个位置受到控制。
好吧,这是一个复杂的主题,在很大程度上取决于您的项目的体系结构,所以如果这不能正确回答您的问题,请对不起。
在乔纳森(Jonathan)的结构的基础上,我进行了一些修改:
Users:
+ userid
+ roleid /* Associate a Role to a User */
Roles:
+ roleid
+ rolename
+ roleinherit /* Added this field */
Permissions:
+ permissionid
+ permissionname
RolePermissions:
+ roleid
+ permissionid /* Associate a Permission to a Role */
能够继承其他角色确实可以帮助简化访问控制。 例如,您可以说“主持人”角色继承了“用户”角色,后者又继承了“来宾”角色。 这样,您就永远不会有来宾可以做的事情,即使主持人也做不到。
当然,此结构可能难以实现,因为您无法再创建简单的查询来进行检查。 处理这些问题的一种好方法是创建一个递归函数,该函数为用户角色提取数据,然后将其与该函数的结果合并为继承角色。
function getPermissions($roleID) {
// get info about this role and store it in $permissions. Assume we also set $inheritFrom
if ($inheritFrom == 0) return $permissions;
else return array_merge($permissions, getPermissions($inheritFrom));
}
确保缓存此函数的结果,因为它可能会变得很繁重。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.