Задать вопрос

Стоит ли хранить зашифрованные данные пользователя в Local/Session Storage на клиенте?

Доброго времени суток!
Задумка:
При входе в систему 1-н раз сделать запрос на права пользователя (его действия с объектами, например, имеет ли пользователь обращаться к определенной таблице или делать вставку, кто он и т.д.). На выходе получаю (пример) следующее результирующее множество в виде многомерного массива:
$arr = [ 
    [
        'r' => 'Администратор',
        'og' => 'Таблицы', 
        'obj' => 't1', 
        'ac' => 'SELECT'
    ],
    [    
        'r' => 'Администратор',
        'og' => 'Таблицы',
        'obj' => 't1', 
        'ac' => 'INSERT' 
    ],
    [    
        'r' => 'Администратор',
        'og' => 'Таблицы', 
        'obj' => 't1', 
        'ac' => 'UPDATE'
    ],
    [    
        'r' => 'Администратор',
        'og' => 'Таблицы', 
        'obj' => 't1', 
        'ac' => 'DELETE'
    ],
    [    
        'r' => 'Администратор',
        'og' => 'Таблицы', 
        'obj' => 't2', 
        'ac' => 'SELECT'
    ],
    [    
        'r' => 'Администратор',
        'og' => 'Формы', 
        'obj' => 'log', 
        'ac' => 'INSERT'
    )
  ];


Что хочу:
Сгенерировать пригодное для хранения представление массива (сериализовать) и закодировать полученные данные. Далее отправить код хранится в Session Storage.

Для чего:
Тут, скорее, уже ближе подхожу к своему вопросу, который напишу ниже.
Чисто субъективное мнение, чтобы каждый раз не обращаться к БД и не тратить на это время, можно получить зашифрованные данные из хранилища браузера и передать обработчику, который, в свою очередь, рассериализует и раскодирует зашифрованные данные в обратном порядке. А с помощью пользовательской ф-ции, например такой:
function handler(array $arr, ...$par) {
    $flag = false;
    if (is_array($arr)) {
        foreach ($arr as $key => $val) {
          if(is_array($val)) {
            $compare = array_diff($par, array_values($val));
                if (count($compare) < 1) {
                    $flag = true;
                    return $flag;
                }
            }
        }
    }
}

$q = handler($arr, 't1','INSERT', 'Таблицы');
if ($q) {
    echo "Совпадения найдены!";
}
else {
    echo "Совпадения НЕ найдены!";
}

смогу понять, к примеру, может ли пользователь делать записи в таблицу "t1" или нет, какая у него роль и т.п.
Т.е. все эти манипуляции для того, чтобы каждый раз не обращаться к БД.

Теперь САМ ВОПРОС:
1. Стоит ли так делать и почему;
2. Какой будет прирост производительности (разница обращение к файлу обработчика vs стучаться в БД);
3. Как Вы решаете подобные вопросы.

Если я ошибаюсь, подскажите пути решения!

Всем удачи и хорошего настроя на весь день!
  • Вопрос задан
  • 428 просмотров
Подписаться 4 Простой Комментировать
Ответ пользователя index0h К ответам на вопрос (7)
index0h
@index0h
PHP, Golang. https://github.com/index0h
1. Стоит ли так делать и почему;

Нет. Проверка прав должна выполняться на сервере и не зависеть от внешних систем, к которым нет доверия (это я про фронт). Фактически вы контроль доступа хотите передать другой стороне.

2. Какой будет прирост производительности

Прирост то будет, но меньше, чем вы надеетесь. Но не делайте так, еще раз.

3. Как Вы решаете подобные вопросы.

Один раз разобрался с https://symfony.com/doc/current/security.html и пользуюсь.
Ответ написан
Комментировать