Страницы

суббота, 2 апреля 2016 г.

JavaScript Role Based Access Control

На днях по случаю увидел один пост, посвященный реализации контроля доступа в Node.js, и предложенный вариант меня немного удивил. После просмотра реализации "ролей" я понял в каком ключе написано все остальное, пролистал пост до конца и был удивлен еще больше - автор поста пишет книги по безопасности Node.js приложений! Тут "Остапа понесло" и я решил прокомментировать промо этого поста: "It could be implemented much easier using bit masks".


Первое что приходит на ум на тему управления доступом на основе ролей это битовые маски.

Пример, приведенный мной в ответ на непонимание автора о чем речь в моем комментарии:
var read = parseInt('001', 2);
var write = parseInt('010', 2);
var publish = parseInt('100', 2);
 
var can = (...arr) => arr.reduce((n, int) => n | int, 0);
var guest = can(read);
var writer = can(read, write);
var manager = can(read, write, publish);
 
var hasRightsTo = (right) => (role) => !!(role & right);
var hasRightsToRead = hasRightsTo(read);
var hasRightsToWrite = hasRightsTo(write);
var hasRightsToPublish = hasRightsTo(publish);
 
hasRightsToRead(guest); // true
hasRightsToRead(writer); // true
hasRightsToRead(manager); // true
hasRightsToWrite(guest); // false
hasRightsToWrite(writer); // true
hasRightsToWrite(manager); // true
hasRightsToPublish(guest); // false
hasRightsToPublish(writer); // false
hasRightsToPublish(manager); // true

Easy peasy lemon squeezy: никаких classinherits, indexOf и т.п.

В итоге автор встал в позицию "мой код круче", как-будто я пытался доказать ему обратное... и эти люди запрещают мне ковырять в носу :)