用于隐藏链接的PHP访问控制列表

时间:2014-01-29 13:12:12

标签: php access-control

我需要在PHP中创建一个系统,该系统将在主页上使用多个链接,但并不是所有用户都可以根据用户登录的组来查看这些链接:

  1. 嘉宾 - 可以在留言簿上写一些内容,但可能不会改变它们
  2. 员工 - 可以创建客人并查看他们的预订并更改留言簿
  3. 经理 - 他们可能拥有所有可用的链接。
  4. 但链接可能不会分散,必须包含在主页中,如果您不在正确的组中,则必须隐藏。

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

3 个答案:

答案 0 :(得分:2)

您所寻找的内容通常被称为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:提供的维基文章非常理论化。您可能只想谷歌搜索“php访问控制系统”或类似的查询,以便开始使用其他人提出的解决方案。

答案 1 :(得分:1)

为每个用户提供一个数字,以确定他们属于哪个类别。例如,客人将是1,员工将是2,经理将是3.然后当他们登录时,您将其存储在会话中。

要显示任何给定类别的链接,您可以执行此操作。只需更改每个类别的数量。

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

答案 2 :(得分:1)

假设您已经设置了用户角色和某种类,您可以通过以下方式轻松完成此操作:

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