我是php新手,我目前正在创建一个电子商务网站。我为管理员创建了一个CMS后端,用于添加/编辑/删除产品,管理订单,管理商店配置以及添加/编辑/删除用户。
我无法找到如何设置用户权限/访问权限,以便: - 一般工作人员只能访问管理订单和 - 管理人员可以访问所有内容
所以基本上给用户一个角色,让他们有限制或完全访问所有内容。
是否有任何教程或任何具有添加此功能的经验的人可以指出我正确的方向?
任何帮助将不胜感激。感谢
答案 0 :(得分:2)
@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 */
而不是级联角色,或者只允许用户处于单一角色 - 具有多个角色的用户提供了最大的灵活性。
答案 1 :(得分:1)
权限与角色相关联,用户与角色相关联。虽然毫无疑问,有许多方法可以实现这种类型的系统,但接下来是一个快速的概念,您可以从中开始思考:
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 /名称来确定是否允许用户执行任何给定的操作action,以及RolePermissions表中其角色的ID /名称。
if ( $user->allowed( 'deleteUser' ) ) {
$users->remove( $uid );
}
当然,数据库方面只是工作的第一部分。接下来,您需要实现数据库和代码之间的连接。
答案 2 :(得分:1)
有几种方法可以取决于您的应用的增长方式。如果您确定只有这两个配置文件,那么只需在“用户”表中添加“配置文件”字段即可。
我想您已经实现了登录管理,然后您可能会在会话中保留已记录的用户ID。只需保留配置文件类型,每次显示一些只能由管理员访问的组件时,请将其包装在
中<?php if ($_SESSION['logged_user_profile'] == 'manager'): ?>
<!-- display your thing here -->
<?php endif; ?>
请注意,这只会隐藏元素。您必须在代码中的任何位置执行此检查,以防止执行相应的操作...
如果您使用像CodeIgniter这样的MVC框架,那么(更好)的方法是通过您的访问控制器挂钩所有请求,并将用户重定向到“禁止访问”页面,如果他试图访问他不允许的内容。这样,您的访问权限仅限于一个位置。
嗯,这是一个复杂的主题,很大程度上取决于你的项目架构,如果这不能正确回答你的问题,那就很抱歉。
答案 3 :(得分:1)
从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));
}
确保缓存此函数的结果,因为它可能会变重。