2

实际问题

  1. 如何“映射”访问限制以便可以从 php 和 javasript 使用?
  2. 我应该使用哪种方法在 php 和 javascript 之间共享访问限制/规则?

解释

我使用 php 创建了一个 RESTful 后端,它将使用上下文感知访问控制来限制数据访问和修改。例如,一个人可以修改属于他的地址信息,并且可以查看(但不能修改)同一组中所有其他人的地址信息。当然,组管理员可以修改该组中所有人员的地址详细信息。

现在,php 方面非常“简单”,因为这只是一堆检查。Javascript 方面也很“简单”,因为它也只是一堆检查。这里真正的问题是如何让这些支票来自同一个地方?

Javascript 使用检查来显示/隐藏编辑/保存按钮。PHP 使用检查来进行实际更改。

的,我知道如果我在服务器上运行 javascript(NodeJS 等),情况会更简单,但是后端已经完成,此时改变方式会导致重大挫折。

也许有人已经设计了一种以“被动”方式对访问检查进行建模的方法,然后只使用某种“编译器”来运行实际检查?

编辑:

值得一提的是,前端(js)部分是用AngularJS构建的......

编辑2

这是一些伪代码,用于澄清我认为我正在寻找的内容,但完全不确定这是否可以大规模实现。从好的方面来说,所有访问限制都将集中在一个地方,并且在需要时易于修改。在黑暗的一面,我将不得不用两种语言编写 AccessCheck 和 canAct 函数,或者想出一种方法来 JIT 将一些伪代码编译为 javascript 和 php :)

AccessRestrictions = {
    Address: {
        View: [
            OWNER, MEMBER_OF_OWNER_PRIMARY_GROUP
        ],
        Edit: [
            OWNER, ADMIN_OF_OWNER_PRIMARY_GROUP
        ]
    }
}

AccessCheck = {
    OWNER: function(Owner) {
        return Session.Person.Id == Owner.Id;
    },
    MEMBER_OF_OWNER_PRIMARY_GROUP: function(Owner) {
        return Session.Person.inGroup(Owner.PrimaryGroup)
    }
}

canAct('Owner', 'Address', 'View') {
    var result;
    AccessRestrictions.Address.View.map(function(role) {
        return AccessCheck[role](Owner);
    });
}
4

2 回答 2

2

第一件事。

您不能“在服务器上运行 JavaScript”,因为 Javascript 总是在客户端上运行,就像 PHP 总是在服务器上运行而不是在客户端上运行一样。

接下来,这是我的想法。

  1. 定义执行检查所需的小型函数库。这可以像单个函数一样简单,它为您的权限返回布尔值或任何格式。确保返回的值对 PHP 和 Javascript 都有意义(这意味着,返回 JSON 字符串的频率往往更高)

  2. 在您的主要 PHP 脚本中,当您需要检查权限并使用您定义的函数来确定用户是否被允许时,请包含该库。

  3. 您的前端是需要更新最多的前端:当您需要确定用户的权限时,向您的服务器发出 AJAX 请求(如果您当前的脚本是,您可能需要编写一个类似于 #2 的新脚本来处理 AJAX 请求'不够灵活)这将简单地重用您的权限库。由于返回值采用 JavaScript 易于读取的格式,因此当您收到响应时,您将能够检查要向用户显示的内容

于 2013-04-23T06:44:17.913 回答
0

这个问题有一些解决方案。我假设您存储会话变量,例如 PHP 会话中授权用户的名称。假设您需要共享的只是 $authenticated_user 变量。我假设我只是一个字符串,但它也可以是一个具有权限等的数组。

如果在加载 AngularJS 应用程序之前 $authenticated_user 是已知的,您可以准备一个小的 PHP 文件,它模仿如下的 JS 文件:

配置.js.php:

<?php
session_start();
$authenticated_user = $_SESSION['authenticated_user'];
echo "var authenticated_user = '$authenticated_user';";
?>

如果您将它包含在应用程序的标头中,它将告诉您谁在服务器端登录。客户端只会看到这个 JS 代码:

var authenticated_user = 'johndoe';

你也可以用 ajax 加载这个文件,如果你把它包装在一个函数中,甚至更好的 JSONP:

<?php
session_start();
$authenticated_user = $_SESSION['authenticated_user'];
echo <<<EOD;
function set_authenticated_user() {
    window.authenticated_user = '$authenticated_user';
}
EOD;
?>
于 2013-04-23T07:36:40.600 回答