Что-то вроде
table users
username: string
password_hash: hex
acl: bit array
username - это имя пользователя, password_hash - это хэш пароля с частичкой соли. Нельзя хранить простой пароль, но ты уже знал это, не так ли?
ACL объявлен как строка, но используется как битовый массив.
Каждый бит представляет собой определенное разрешение. 1 означает, что у пользователя есть разрешение, 0 - нет. Чтобы проверить значение определенного бита, вы выполняете битовое И для acl. Если результат не равен нулю, доступ предоставляется. Если результат равен нулю, доступ запрещен.
Например:
// permission to read employee data
public const long READ_EMPL_DATA = 0x01
...
{
User user = database.GetSomeUser();
// test for READ_EMPL_DATA permission
if (0 != (user.ACL & READ_EMPL_DATA)) {
// access granted
} else {
// access denied
}
// give READ_EMPL_DATA permission
if (0 != (user.ACL & READ_EMPL_DATA))
user.ACL = user.ACL & READ_EMPL_DATA
}
Чтобы добавить поддержку группы, добавьте пару таблиц.
table group
groupname: string
acl: bit array
table user_group
user_id: id
group_id: id
И в дополнение к проверке прав доступа на уровне пользователя, тестируйте группы, к которым принадлежит пользователь. Конечно, вы напишите некоторые вспомогательные функции, возможно хранимую процедуру.
Надеюсь, ты начал. Если нет, я могу дать вам более наглядный пример или более актуальный код или другую помощь.