我是 php 新手,目前正在创建一个电子商务网站。我为管理员创建了一个 CMS 后端来添加/编辑/删除产品、管理订单、管理商店配置和添加/编辑/删除用户。
我无法找到如何设置用户权限/访问权限,以便: - 普通员工只能访问管理订单 - 管理人员可以访问所有内容
所以基本上给用户一个角色,这会给他们限制或完全访问一切。
是否有任何教程或具有添加此功能的经验的任何人可以为我指明正确的方向?
任何帮助将不胜感激。谢谢
@Johnathan 建议的替代设计是user
HAS_MANYroles
和每个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 框架,一个(更好)的方法是通过您的访问控制器挂钩所有请求,如果他试图访问他不允许访问的内容,则将用户重定向到“访问禁止”页面。这样,您的访问权限仅在一个地方受到控制。
好吧,这是一个复杂的主题,很大程度上取决于您的项目体系结构,如果这不能正确回答您的问题,我们深表歉意。
从乔纳森的结构延伸,我做了一些修改:
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));
}
确保缓存此函数的结果,因为它可能会变得很重。