我是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 */
请注意在第一个表中如何直接从用户表中关联角色。如果要为用户分配多个角色,可以将其分解并放在自己的表中。
完成此操作或类似操作后,您可以通过会话变量跟踪用户的角色,并通过在 RolePermissions 表中查找该操作的 id/名称及其角色的 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));
}
确保缓存此函数的结果,因为它可能会变得很重。