将权限存储到多维数组php中

时间:2011-12-04 20:05:32

标签: php oop class extraction

好的,我只是想在PHP中制作更松散耦合的类等,以提高我的技能。我的计算机上有一个本地测试数据库,对于用户表,我有一个名为“role”的列。我正在尝试构建一个函数,它是获取用户权限的一般函数,因此它不依赖于他们尝试执行的特定任务。

当用户尝试执行某些操作(例如创建新的论坛主题等)时,我想查询数据库,如果“role”是某个值,则将权限存储在多维数组中,如下所示:

$permissions = array(
    'forums' => array("create", "delete", "edit", "lock"),
    'users' => array("edit", "lock")
);

然后,我希望能够在用户通过检查isset($ var)发布表单后,在每个PHP文件的顶部键入以下内容,以搜索该数组以获取特定权限。因此,如果用户正在尝试编辑用户,我希望能够通过类方法执行以下操作(如果可能)

if (Class::get_permissions($userID),array($permissionType=>$permission))) {
   // do query
} else {
   // return error message
}

如何有一个松散耦合的权限检查功能,这将是一个很好的方法,可以做这样的事情?它不必像这样完全布局,而是松散耦合,因此可以重复使用而不必受某项任务的约束。但是我希望能够拥有一系列权限而不仅仅是“admin”,“user”等可重用性,因此它不会限制我的选择。因为我现在在php脚本文件的顶部有一堆类似的代码。

if (Class::get_permissions($userID) == "admin") {
   // allow query
} else {
   // return error
}

感谢您提供的任何意见,以帮助我实现这一点,我不会一遍又一遍地写相同的内容。

2 个答案:

答案 0 :(得分:3)

你的问题有点模糊,但我会尽我所能。您说您正在将他们的权限存储在数组$permissions中。

public static $permissions = array();

public static function setPermissions($perms)
{
    if (!is_array($perms)) {
        throw new Exception('$perms must be an array.');
    }
    self::$permissions = $perms;
}

public static function hasPermission($section, $action)
{
    if (array_key_exists($section, self::$permissions)
        && in_array($action, self::$permissions[$section])
    ) {
        return true;
    }

    return false;
}

使用该逻辑,当您从DB读取用户的权限时,请设置Class::$permissions静态var,如下所示:

Class::setPermissions($permissions);
// ...
if (Class::hasPermissions($page, $action)) {
    // user has permission
}

请注意,我的代码非常通用,在我有更多信息之前必须保持这种状态。现在,我假设您的权限数组使用页面部分作为索引,而数组是该页面部分中用户有权访问的操作列表。因此,假设$page已设置为"forums"并且用户当前正在尝试执行编辑(因此$action = 'edit'),则Class::hasPermission()函数将返回true。 / p>

答案 1 :(得分:2)

我在评论中用完了字符......但这是你的评论。

@corey而不是一个静态对象,我包含一个在用户会话中设置我的权限的函数。它作为我的LoginCommand类的一部分,显然在用户登录时被调用。

然后将权限从视图存储到视图,我不必继续查询。大多数事情的权限检查只在用户登录时发生。但是,某些敏感的事情我会运行另一个查询来仔细检查。这样做的缺点是,如果用户的权限在用户具有活动会话时发生更改,则不会将这些更改推送给用户。

请记住要保持良好的会话安全性。 PHP Session Security

您不会在会话大小中存储数据的唯一原因是因为您的会话太大了。但除非你的会话是兆字节,否则你可能不需要担心这个。