2012-01-26 5 views
0

Редактировать: только для меня ясно: Мой вопрос: возможно ли динамически вводить функцию перед всеми вызовами других функций на странице.Функция ввода между вызовами

Я хотел бы, чтобы одна функция вводила себя перед всеми вызовами функций. Я пытаюсь реализовать списки управления доступом для приложения JS. Так, например, для. Фреда

Пользователь может получить доступ к функции app.addPage(), но он не может получить доступ функцию app.removePage();

Так что теперь, как я называю первоначальную функцию, которая должна была после вызова функции привратника?

Я полагаю, я мог бы изменить мое приложение таким образом, что каждый вызов метода выглядит следующим образом:

app.acl().functionCall(); 

Но я хотел, чтобы придать acl() автоматически до того, как вызов функции в некоторой динамично. Возможное?

+0

Ваше описание поведения 'alert ('tomato');' после запуска 'Function.prototype.call = function() {console.log ('helloooo');}' неточно. Учитывая это, трудно даже сказать, что вы просите. –

+0

@ Iwburk: Извините, не уверен, что вы имеете в виду? Я тестирую в окне консоли Chrome и добавляю Function.prototype.call = function() {console.log ('hello')} приводит ко всем вызовам функций на этой странице, выводящим «hello» на консоль. Итак, например: предупреждение ('test') не будет показывать предупреждение, которое будет записывать «hello» на консоль. Я пытаюсь написать функцию гейткипера, которая позволяет выполнять некоторые функции на странице, а не другие, в зависимости от уровней доступа. –

+0

@Eli_s, который не является «предупреждением», выполняющим запись, но консоль, которая использует '.call'. 'alert ('tomato')' не использует '.call' – Esailija

ответ

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) с функцией, которая сначала проверяет если пользователь имеет привилегию и, если он/она, вызывает функцию, а если не звучит сигнал тревоги.

Как я уже сказал, это имеет no Преимущества безопасности. Если кто-то знает, как использовать FireBug, они на полпути к тому, чтобы победить этот любой любой другой подход на стороне клиента, который вы могли бы придумать.

+0

Спасибо Джордан. Да, этот подход исключительно ради удобства, а не безопасности. Спасибо за ваш замечательный код ... именно то, что я искал :) –

+0

Извините: быстрый вопрос: не приложение [funcName] = function() {...} перезаписать функцию. Затем как вернуть приложение [funcName] .apply (...) знать, чтобы вызвать оригинал? –

+0

А, хорошо поймать. Перед заменой вы должны «сохранить» оригинальную функцию. Я обновил свой код. –

Смежные вопросы