在呼叫之间注入功能

时间:2012-01-26 23:34:33

标签: javascript prototype function-calls

  

编辑:只是为了清楚:我的问题是:是否可以动态   在页面上的所有其他函数调用之前注入一个函数。

我希望在所有函数调用之前注入一个函数。 我正在尝试为JS应用程序实现访问控制列表。所以对于例如。

用户fred可以访问函数app.addPage(),但他无法访问函数app.removePage();

那么现在如何在调用网守功能后调用原来的函数?

我想我可以修改我的应用程序,以便每个方法调用都是这样的:

app.acl().functionCall();

但是我希望在动态调用之前自动注入acl()。可能的?

1 个答案:

答案 0 :(得分:0)

尝试在客户端应用程序中发挥这种安全控制是徒劳的。即使您可以,例如,覆盖Function.prototype,仍然可以使用非特权用户并使用原始功能重新覆盖它。或者更改变量以使自己成为特权。或者只是构建一个POST请求并将其直接发送到服务器,完全绕过您的脚本。没有办法绝对强制执行您在客户端代码中尝试做的事情。

但是,如果您为便利而不是安全执行此操作,请考虑以下事项:

// define your functions as usual
app.showCatVideo = function (...) { /* ... */ }    
app.deletePage   = function(...) { /* ... */ }
app.dropBombs    = function(...) { /* ... */ }

// specify which ones are privileged
var privilegedFunctionNames = [ "deletePage", "dropBombs" ];

for( var i = 0; i < privilegedFunctionNames.length; i++ ) {
  var funcName = privilegedFunctionNames[ i ],
    , origFunc = app[ funcName ];
  ;

  delete app[ funcName ];

  // replace the function with this one
  app[ funcName ] = function() {
    // check the user
    if( theUser.isPrivileged() ) {
      // call the original function with the arguments passed
      return origFunc.apply( app, arguments );
    }
    else {
      // hissy fit
      alert( "Unauthorized!" );
    }
  }
}

这只是将你指定的函数(在privilegedFunctionNames中)用一个函数包装,该函数首先检查用户是否具有特权,如果是,则调用该函数,如果没有则发出警报。

就像我说的那样,这有没有安全性好处。如果有人知道如何使用FireBug,那么他们就可以用一半的方法来击败你可以提出的任何其他客户端技巧。