|
Вопрос по секьюрити
|
|||
---|---|---|---|
#18+
Господа здравствуйте. Есть потребность в реализации секьюрити такого характера: Пусть у нас существует таблица и несколько пользователей. В этой одной таблице хранятся данные всех пользователей. Непосредственно права на операции с ней имеет _только_ админ и создается она админом, и данные туда тоже заносятся только им, и селект гонять может только он. Необходимо предоставить пользователям механизм , который бы позволял, например, выбирать(возможно добавлять, удалять, модифицировать) информацию из этой таблицы. НО сделать это надо так, чтобы пользователь, работающий с таблицей видел только свои данные и не видел чужих. И при этом не просто не видел, но и не имел физической возможности доступа к ним отказавшись, скажем от приложения, которое работает с данной базой, а получив доступ туда просто ручками через СКЛ консольку. Соотв. для этого в таблице будут естественно поля типа ИД_ЮЗЕР. Я вот что думаю. Если бы это было возможно, то организовать сей механизм так: Админ создает таблицу. Когда требуется дать юзеру права на выборку данных из неё, то Админ создает ХранимуюПроцедуру (ХП), которая по ИД Юзера осуществляет в выражении WHERE контроль выбираемых значений, чтобы в конечную выборку попадали только те значения, которые принадлежат пользователю. Далее.. Пользователь работает с этой таблицей только с помощью ХП, права на выполнение которой дает ему Админ, потому что прямых грантов на выборку данных ему не дано. И эта ХП единственный способ получить доступ к данным. Таким образом он никак не сможет при всем желании увидеть данные др. юзера. В данном примере ХП я представил в виде объекта посредника, который может запускаться юзером, которому даны права на его выполнение, однако этот объект (в данном случае ХП) запустившись работает в контексте своего создателя, т.е. админа, а потому имеет доступ к таблице. Т.е. в этом случае ХП выступает в роли некоторого секьюрити-моста. Описанный выше пример сделать нельзя, как я понимаю. Потому что ХП будет запускаться в контексте юзера, а значит она не сможет выбрать данные из таблицы, потому что доступа к ней(таблице) у неё не будет. Если понятен смысл подобных объяснений, то подскажите как можно было бы реализовать подобных механизм секьюрити. Т.е. с помощью чего-либо ( например в описанном выше примере это ХП) эмулировать для юзеров работающих физически с одной таблицей различную её "область видимости" , создавая тем самым эффект, что у каждого юзера своя таблица. Спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2002, 14:44 |
|
Вопрос по секьюрити
|
|||
---|---|---|---|
#18+
Функция, процедура, пакет по умолчанию имеют права создателя, а не вызывающего. Для того. чтобы они работали с правами вызывающего, требуется указать authid current_user: http://download-west.oracle.com/docs/cd/A97630_01/server.920/a96540/statements_110a.htm#2068964 Представления- второй способ row-level security: http://www.interface.ru/fset.asp?Url=/oracle/ks.htm Еще посмотри на Fine Granted Access Control: http://www.interface.ru/fset.asp?Url=/oracle/ks_1.htm http://www.oracle.com/ru/oramag/august2001/index.html?dev_tkyte.html ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2002, 15:30 |
|
Вопрос по секьюрити
|
|||
---|---|---|---|
#18+
В Oracle 8i мы осуществляем это через детальный контроль доступа. Не знаю только есть такакя возможность в предыдущих версиях. Таблица: CREATE TABLE PRIMER( OBJ_ID NUMBER(18) PRIMARY KEY, ID_USER VARCHAR2(32), USER_DATA VARCHAR2(32)) В нее след- данные: OBJ_ID ID_USER USER_DATA --------------------------------------- 1 FORTMETA 1111 2 FORTMETA 22222 3 SCOTT 333 Для осуществления того чтоб FORTMETA видел только данные FORTMETA, если он залогинился под ним надо создать пакет: CREATE OR REPLACE PACKAGE PRIMER_PKG IS FUNCTION Get_Data_From_Primer (p_schema in varchar2,p_object in varchar2) return varchar2; END PRIMER_PKG; / CREATE OR REPLACE PACKAGE BODY PRIMER_PKG IS FUNCTION Get_Data_From_Primer (p_schema in varchar2,p_object in varchar2) return varchar2 IS BEGIN IF USER='ADMIN' THEN RETURN ''; ELSE RETURN 'ID_USER=USER'; END IF; END; END PRIMER_PKG; / Далее создать Policy для таблицы PRIMER, связанный с указанной пакетной функцией: BEGIN dbms_rls.ADD_POLICY( object_schema=>'ADMIN', object_name=>'PRIMER', policy_name=>'primer_plc', function_schema=>'ADMIN', policy_function=>'PRIMER_PKG.Get_Data_From_Primer', statement_types=>'select,insert,update,delete', update_check=>TRUE); END; После этого при логине под FORTMETA мы получим след. результат OBJ_ID ID_USER USER_DATA --------------------------------------- 1 FORTMETA 1111 2 FORTMETA 22222 с помощью какого бы мы инструмента не обращались к данным. А под пользователем ADMIN мы увидим все данные. Причем данное ограничение действует и на обновление и вставку данных statement_types=>'select,insert,update,delete', В случае если оракл не поддерживает данной возможности то работа только через представления и навешенные на них INSTEAD OFF триггера. С уважением Ильяс. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2002, 15:40 |
|
Вопрос по секьюрити
|
|||
---|---|---|---|
#18+
Для того что-бы из таблицы пользователь смог выбирать только свои данные, для этого в таблицу вводится столбец, определяющий пользователя, каким угодно образом: именем, его UID или через отдельную таблицу пользователей - не важно. Главное есть идетификатор пользователя, который определяет его однозначно. Таблица должна быть помещена в схему, которая не является собственной не для одного из пользователей, иначе у него будут в любом случае права к таблице. Для этого создаётся отдельная схема: Код: plaintext 1. 2.
От имени work создаём таблицу: Код: plaintext 1. 2. 3. 4. 5.
Допустим юзера заполняет таблицу ордеров, в которой есть номер,сумма,дата ордера. Поле id_user означает какой пользователь вносит данные. Замечание: прав у пользователей на таблицу нет никаких, поэтому они не могут ничего сделать. Создадим двух рабочих юзера(от имени SYS): Код: plaintext 1. 2. 3. 4.
Создадим пакет для регистрации юзеров(от имени work): Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
Гранты на пакет: Код: plaintext 1.
Создадим вью(от имени work): Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9.
дадим право прсомотра вью(от имени work): Код: plaintext 1.
Теперь запрос для получения данных: Код: plaintext 1. 2. 3. 4.
Смысл в следующем: Пользователи смогут получить данные, если они зарегистрируются. Для регистрации используется пакет ses_mod и процедура setUserId. Вью возвратит данные только для текущего юзера, так как идёт проверка id_user через функцию getUserId(). Добавим в ручную для понимания идеи данные в таблицу, как-будто юзера уже их туда занесли: Код: plaintext 1. 2. 3. 4. 5. 6.
Теперь проверим как работает вью: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Видим что данные не получены. Теперь зарегистрирем пользьвателя: Код: plaintext 1. 2. 3.
Попробуем получит данные еще раз: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Данные есть. Примерно делается так. Это в общих чертах. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2002, 16:21 |
|
Вопрос по секьюрити
|
|||
---|---|---|---|
#18+
А после добавления в определиние вьюшки "WITH CHECK OPTION", то юзвери смогут апдейтить вьюшку, но не смогут выползти за этот самый CHECK OPTION. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2002, 22:39 |
|
Вопрос по секьюрити
|
|||
---|---|---|---|
#18+
Я бы посоветовал для данной задачи использовать Fine Granted Access Control (Детальный контроль доступа). Поразбираться, конечно придется, но , как мне кажется, дело того стоит. Во всяком случае, у меня задача, похожая на твою, решается именно так. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2002, 05:09 |
|
Вопрос по секьюрити
|
|||
---|---|---|---|
#18+
Можно еще здесь почитать Детальный контроль доступа и контексты приложения. Т.Кайт ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2002, 10:32 |
|
|
start [/forum/topic.php?fid=52&msg=32076436&tid=1992535]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
39ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
others: | 12ms |
total: | 147ms |
0 / 0 |