Прежде всего, пользователь не может редактировать переменные сеанса. Единственное, что сохраняется на компьютере пользователя - это идентификатор сеанса. Этот идентификатор затем используется сервером для получения пар ключ / значение, которые хранятся ТОЛЬКО на сервере. С точки зрения клиента невозможно изменить значения по прихоти.
Во-вторых, я бы не стал слишком сильно беспокоиться о подключении к базе данных. Избегайте повторения, но не слишком переживайте по поводу первого соединения.
Наконец, мой любимый способ сделать несколько разрешений без создания ролей - использовать двоичную математику. Кому-то это нравится, кому-то нет, но я считаю это полезным.
Чтобы использовать этот метод, представьте, что мы определяем следующие значения:
CAN_EDIT_SOMETHING = 1 // Powers of 2
CAN_SEE_SOMETHING_ELSE = 2
CAN_DO_ADMIN_STUFF = 4
... = 8
Чтобы дать людям несколько разрешений, используйте двоичный ИЛИ
PERMISSIONS = CAN_EDIT_SOMETHING | CAN_DO_ADMIN_STUFF
Чтобы проиллюстрировать, как это работает, мы можем взглянуть на биты:
0b0001
OR 0b0100
---------
0b0101
Чтобы проверить, есть ли у кого-то разрешение, используйте двоичное И
if( PERMISSIONS & CAN_EDIT_SOMETHING != 0 ) {
}
Чтобы увидеть, как это работает, мы снова посмотрим на биты
0b0101
AND 0b0001
----------
0b0001 // Not equal to 0. They must have that permission!
Последнее преимущество этого метода состоит в том, что он позволяет легко объединять несколько разрешений в «мета-разрешения»
// If both EDIT_SOMETHING and ADMIN_STUFF are tasks that an admin
// can perform, we can combine them easily
//
IS_FULL_ADMIN = CAN_EDIT_SOMETHING | CAN_DO_ADMIN_STUFF
// We can then use this value exactly as we do any other permission
//
PERMISSIONS = IS_FULL_ADMIN | CAN_SEE_SOMETHING ELSE
Используйте его, если хотите, но это хороший прием в вашем арсенале.