【问题标题】:User Access Levels on PHPPHP 上的用户访问级别
【发布时间】:2012-05-07 09:01:22
【问题描述】:

我是 php 新手,目前正在创建一个电子商务网站。我为管理员创建了一个 CMS 后端来添加/编辑/删除产品、管理订单、管理商店配置和添加/编辑/删除用户。

我无法找到如何设置用户权限/访问权限,以便: - 一般员工只能访问管理订单和 - 管理人员可以访问所有内容

所以基本上给用户一个角色,让他们可以限制或完全访问所有内容。

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

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

【问题讨论】:

标签: php security


【解决方案1】:

@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 */

而不是级联角色,或者只允许用户担任单个角色 - 拥有多个角色的用户提供了最大的灵活性。

【讨论】:

    【解决方案2】:

    权限与角色相关联,用户与角色相关联。毫无疑问,有很多方法可以实现这种类型的系统,下面是一个快速的概念,您可以从中开始思考:

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

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

    【讨论】:

      【解决方案3】:

      有几种方法可以做到这一点,具体取决于您的应用将如何发展。如果你很确定你只有这两个配置文件,那么只需在“用户”表中添加一个“配置文件”字段。

      我想你已经实现了登录管理,那么你可能会在会话中保留登录的用户 ID。只需保留配置文件类型,并且每次显示一些只应由经理访问的组件时,将其包装在

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

      请注意,这只会隐藏元素。您还必须在代码中的任何地方执行此检查,以防止执行相应的操作...

      如果你使用像 CodeIgniter 这样的 MVC 框架,一个(更好)的方法是通过你的访问控制器挂钩所有请求,如果他试图访问他不允许访问的东西,则将用户重定向到“访问禁止”页面.这样,您的访问权限只在一个地方受到控制。

      嗯,这是一个复杂的主题,很大程度上取决于您的项目架构,如果这不能正确回答您的问题,请见谅。

      【讨论】:

      • 嘿 Gaet,我想这就是我正在寻找的东西。如上所述,只有 2 个配置文件。这真的可以帮助我。谢谢
      【解决方案4】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2014-10-11
        • 1970-01-01
        • 2018-06-12
        • 1970-01-01
        • 1970-01-01
        • 2013-08-26
        • 1970-01-01
        • 1970-01-01
        • 2016-04-30
        相关资源
        最近更新 更多