【问题标题】:storing permissions into multi dimensional array php将权限存储到多维数组php中
【发布时间】:2012-01-12 18:35:40
【问题描述】:

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

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

$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
}

拥有一个松散耦合的权限检查功能能够做这样的事情是一种好方法吗?它不必完全像这样布局,而只是松散耦合,以便可以重用而不绑定到某个任务。但是我希望能够拥有一系列权限,而不仅仅是“管理员”、“用户”等以实现可重用性,因此它不会限制我以后的选择。因为我现在在我的 php 脚本文件的顶部有一堆这样的代码。

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

感谢您提供的任何意见,以帮助我解决这个问题,我不会一遍又一遍地写同样的东西。

【问题讨论】:

标签: php oop class extraction


【解决方案1】:

你的问题有点含糊,但我会尽力而为。你说你将他们的权限存储在一个数组中$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;
}

使用该逻辑,当您从数据库中读取用户的权限时,然后像这样设置 Class::$permissions 静态变量:

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

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

【讨论】:

  • 感谢您的意见。不过有一个问题。这种方式似乎我需要将数组存储在 $_SESSION[] 变量中。这是我应该这样做的方式吗?我只是对应该和不应该放入 $_SESSION 变量的内容感到困惑。谢谢!
【解决方案2】:

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

@corey 没有使用静态对象,而是包含一个在用户会话中设置我的权限的函数。显然,它是我的 LoginCommand 类的一部分,每当用户登录时都会调用它。

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

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

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

【讨论】:

  • 所以只要每个用户的会话变量小于 1 MB 你的意思是?因此,如果我真的想在 $_SESSION 变量中将大约 6 个用户数据字段(例如名字、姓氏、用户名、用户 ID 和电子邮件)存储为 User 对象,那么就可伸缩性而言,这完全可以吗?
  • 是的。要获得会话大小的近似值,请使用: $size_of_session_estimate = strlen( serialize( $_SESSION ) );当您的会话变得太大时,有一些方法可以动态设置您的会话保存路径等。我从未见过有人的会话太大,但我从未在 facebook、Amazon 等工作过……另外,投票给我的答案。 :)
猜你喜欢
  • 2016-07-10
  • 2011-07-26
  • 2013-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多