共享php和javascript之间的访问限制

时间:2013-04-23 06:34:32

标签: php javascript json security web-applications

实际问题

  1. 如何“映射”访问限制,以便可以从php和javasript使用?
  2. 我应该使用什么样的方法来共享php和javascript之间的访问限制/规则?
  3. 解释

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

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

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

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

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

    修改

    我喜欢提一下,前端(js)部分是用AngularJS构建的......

    EDIT2

    这是一些伪代码,用于澄清我认为我正在寻找的内容,但我完全不确定这是否可以大规模实现。从好的方面来说,所有访问限制都在一个地方,如果需要,很容易修改。在黑暗的一面,我将不得不用两种语言编写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);
        });
    }
    

2 个答案:

答案 0 :(得分:1)

首先要做的事情。

您无法“在服务器上运行JavaScript”,因为Javascript始终在客户端上运行,就像PHP始终在服务器上运行而从不在客户端上运行一样。

接下来,这是我的想法。

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

  2. 在您的主要PHP脚本中,在需要检查权限时使用库,并使用您定义的功能来确定是否允许用户。

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

答案 1 :(得分:0)

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

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

config.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;
?>