2012-04-26 104 views
1

我是新来的PHP和我正在创建一个电子商务网站。我为管理员创建了一个CMS后端,用于添加/编辑/删除产品,管理订单,管理商店配置以及添加/编辑/删除用户。PHP上的用户访问级别

我无法找出如何设置用户权限/权限,因此: - 普通员工只能访问管理订单和 - 管理人员拥有的一切

访问

所以基本上给用户一个角色这将给他们限制或完全访问一切。

是否有任何教程或任何以前有过添加此功能的经验的人可以将我指向正确的方向?

任何帮助将不胜感激。谢谢

+0

你在使用像Zend或Symfony这样的框架,还是只使用自己的直接php代码?如果你直接编码,你的代码/类结构是什么样的? – Tom 2012-04-26 15:36:18

+0

参考http://en.wikipedia.org/wiki/Access_control_list和Zend框架中的示例实现http://framework.zend.com/manual/en/zend.acl.introduction.html – 2012-04-26 15:38:11

+0

那么现在,我有只实现您的标准用户访问。这些用户都在数据库中,并可以访问所有内容。 我目前正在寻找这个以获得更好的理解:http://en.wikipedia.org/wiki/Role-based_access_control – JUM 2012-04-26 15:40:32

回答

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 /名称该操作以及角色的ID /名称,位于RolePermissions表中。

if ($user->allowed('deleteUser')) { 
    $users->remove($uid); 
} 

当然,数据库方面只是工作的第一部分。接下来,您需要实现数据库和代码之间的连接。

1

有几种方法可以做到这一点,这取决于您的应用程序将如何增长。如果您确信只有这两个配置文件,那么只需在“用户”表中添加一个“配置文件”字段即可。

我想你已经实现了登录管理,那么你可能会在会话中保持记录的用户ID。只要保持配置文件类型也和你每次显示某些组件,应便于只是管理者,敷在

<?php if ($_SESSION['logged_user_profile'] == 'manager'): ?> 
<!-- display your thing here --> 
<?php endif; ?> 

注意,这可能仅仅隐藏元素。你将不得不在你的代码中执行这个检查,以防止相应的动作被执行...

如果你使用像CodeIgniter这样的MVC框架,更好的方法就是将所有的请求您的访问控制器,并将用户重定向到“访问禁止”页面,如果他试图访问他不允许的内容。这样,您的访问权限只能在一个地点进行控制。

那么,这是一个复杂的主题,很大程度上取决于您的项目的体系结构,所以很抱歉,如果这不能正确回答您的问题。

+0

嘿Gaet,我认为这是我正在寻找的那种东西。如上所述,只有2个配置文件。 这真的可以帮助我。谢谢 – JUM 2012-04-26 17:05:28

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

从乔纳森的结构扩展,我做了一些修改:

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)); 
} 

确保缓存此函数的结果,因为它可能会变得很沉重。