【问题标题】:PHP access control list for hiding links [closed]用于隐藏链接的 PHP 访问控制列表 [关闭]
【发布时间】:2014-01-30 00:50:29
【问题描述】:

我需要在 PHP 中创建一个系统,它将在主页上使用多个链接,但并非所有用户都可以看到这些链接,具体取决于登录的用户组:

  1. 客人 - 可以在留言簿上写一些东西,但不能更改它们
  2. 员工 - 可以创建客人并查看他们的预订并更改留言簿
  3. 经理 - 他们可能拥有所有可用的链接。

但链接不能分散,必须包含在首页,如果你不在正确的组中,必须隐藏。

有人可以举例说明如何在 PHP 中完成类似的事情,或者向我发送正确的方向吗?

【问题讨论】:

  • 到目前为止你做了什么吗?
  • 使用条件语句并使用WHERE id='something' AND something_else !='some_var' - 毫无疑问,假设您将使用数据库。有影响的东西。
  • 欢迎来到 Stack Overflow!请注意,标签是独立的,不能组合起来创建概念。组合[access][control] 与单个[access-control] 标签的含义不同。永远记得阅读选择标签时出现的有用描述!

标签: php access-control


【解决方案1】:

您要查找的内容通常称为AC (access control)。最流行的一种是RBAC (role based access control),因为它允许您将您的用户/帐户分组并赋予这些组一定的权限。

让我们看一下最小设置的设计步骤:

基本上你的意思是,你已经为你的用户拥有了某种帐户(Guest 除外,因为那是一个未登录的用户) 现在 RBA 中的角色基本上是具有或不具有某些特权的组。

因此导致以下关系:

  • 零对许多帐户属于零对许多角色(->组,例如“管理员”、“经理”等)
  • 从零到多的角色具有从零到多的特权/权限(例如“访问经理部分”或“更新此记录”)

现在让我们继续,为了实现它,您需要拥有该系统哪个部分的哪些数据

  • 通常,每个帐户的帐户表中都有一个 ID。
  • 角色通常具有 ID 和名称。
  • 权限通常至少有一个类似常量的标识符(它应该是主键,因此它是唯一的 --- 例如 ACCESS_MANAGER - 您可以在下面的代码示例中看到为什么这很有用。它可以用来查找)和名称

这导致以下表格:

Account(AccountID (PK), ...)
Account_Role(AccountID (PK, FK), RoleID (PK, FK))
Role(RoleID (PK), name)
Role_Privilege(RoleID (PK, FK), PrivilegeID (PK, FK));
Privilege(identify (PK), name)

现在您可以管理这些角色所拥有的角色和权限。 例如,如果您想检查当前用户是否具有特定权限,您可以询问您的数据库。

if(
  $this
    ->getCurrentUser()  //would return a dummy guest user with no roles assigned if no user is logged in
    ->hasPrivilege('ACCESS_MANAGER')  //joins account via account_role to role to role_privilege and finally to privilege
) { /*display only links a manager would see*/ }

if($this->getCurrentUser()->hasPrivilege('ACCESS_ADMIN')) { /*display only links an admin would see*/ }

PS:提供的 wiki 文章非常理论化。您可能只想在 Google 上搜索“php 访问控制系统”或类似的查询,以便开始使用其他人提出的解决方案。

【讨论】:

    【解决方案2】:

    给每个用户一个编号来标识他们属于哪个类别。例如,客人是 1,员工是 2,经理是 3。然后当他们登录时,您将其存储在会话中。

    要显示任何给定类别的链接,您可以这样做。只需更改每个类别的数字即可。

    <?php if( $_SESSION[ 'user' ][ 'category' ] == 3 ) : ?>
        <a href="www.google.co.uk">Link for a manager</a>
    <?php endif; ?>
    

    【讨论】:

      【解决方案3】:

      假设您已经设置了用户角色和某种类,您可以通过以下方式轻松做到这一点:

          if($users->role($userid) == "some role") //can be int or string which ever way you set it up
          {
              echo "a href='somelink.php'> Click to access</a>";
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多