Попытка установить такой контроль безопасности в клиентском приложении бесполезна. Даже если бы вы могли, скажем, переопределить 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, он на полпути к победе над любым другим трюком на стороне клиента, который вы можете придумать.