2009-05-26 1 views
0

У меня есть пользователи для моего приложения с списком контроля доступа (это как таблицы, так и схемы/объекты). В настоящее время они считываются из базы данных, значения Boolean используются для указания того, что они могут просматривать/манипулировать. Тем не менее, каждый может по-прежнему перейти к базе данных и изменить данные. Может ли кто-нибудь предложить какое-то предложение о том, что я могу сделать? Надеюсь, я поняла, что у нас есть пользователи (uname + pass) и acl (empui_access, empdat_manipulate). Любые любопытное решения в области безопасности с помощью кода и т.д. ...Предложения по дизайну безопасности для контроля доступа Список в базе данных?

+0

В чем вы работаете? SQL Server? MySQL? Oracle? Есть много разных прав? Много пользователей? Разные уровни доступа для каждого права? – DonkeyMaster

+0

никаких проблем с базой данных я мог бы использовать, это связано с дизайном кодирования. – abmv

ответ

0

Что-то вроде

table users 
username: string 
password_hash: hex 
acl: bit array 

имя пользователя это имя пользователя, 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 

И в дополнение к тестированию на уровне пользователя, проверьте группы, к которым принадлежит пользователь. Конечно, вы напишете некоторые вспомогательные функции, возможно, хранимую процедуру.

Надеюсь, вам это удалось. Если нет, я могу дать вам более наглядный пример или более актуальный код или другую помощь.

+0

не может кто-нибудь изменить ваш бит-массив (я использовал его раньше) из db, и он может изменить права пользователя? – abmv

+0

Это еще одна проблема. Да, кто-то с правильными разрешениями может изменить это значение. Но опять же, этот человек также мог изменить пароль. Речь идет о защите вашей базы данных, и у SQL Server уже есть решение для этого. Например, вы можете предоставить разрешения на чтение гостевых пользователей на наши 3 таблицы, но без прав на запись, они не могут вносить изменения. – DonkeyMaster

+0

Этот acl не связан с db, это требование для бизнеса – abmv

-1

Это относится к PostgreSQL, но вы, вероятно, можете получить хорошие идеи от Veil.

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