编辑:只是要明确一点:我的问题是:有可能动态地在页面上的所有其他函数调用之前注入一个函数。
我希望单个函数在所有函数调用之前注入自己。我正在尝试为JS应用程序实现访问控制列表。例如
用户fred可以访问app.addPage()
功能,但不能访问app.removePage();
功能
那么,现在我该如何在调用看门人函数之后调用原始函数呢?
我想我可以修改我的应用程序,使每个方法调用看起来像这样:
app.acl().functionCall();
但我想在函数调用之前以某种动态方式自动注入acl()
。可能的
试图在客户端应用程序中施加这种安全控制是徒劳的。即使你可以,比如说,覆盖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,他们已经成功击败了这一点——你可以想出的任何其他客户端技巧。