好的,我只是想在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
}
感谢您提供的任何意见,以帮助我实现这一点,我不会一遍又一遍地写相同的内容。
答案 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
您不会在会话大小中存储数据的唯一原因是因为您的会话太大了。但除非你的会话是兆字节,否则你可能不需要担心这个。