powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Активность роли??? (SET ROLE)
22 сообщений из 22, страница 1 из 1
Активность роли??? (SET ROLE)
    #33182352
AciD_v
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подскажите:

1. Когда являются активными роли, назначенные пользователю ?

2. Как проверяются привилегии пользователя при компиляции и выполнении им пакета с AUTHID CURRENT_USER ?

3. Что лучше использовать для динамической активации ролей: SET ROLE или DBMS_SESSION.SET_ROLE ?

( а то я что-то совсем в этом запутался! :( )

Заранее спасибо!
...
Рейтинг: 0 / 0
Активность роли??? (SET ROLE)
    #33182648
Александр Соколов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oracle9i. Руководство разработчика приложений. Основы Создание защищенных ролей приложения
Доступ к базе данных основан на привилегиях, которые часто группируются в роли. Затем роли, содержащие сгруппированные привилегии, предоставляются пользователям приложения. В предыдущих версиях в приложения нужно было встраивать пароль, чтобы гарантировать, что пользователи могут включить предоставленные роли только в приложении. Роли, защищенные встроенными паролями внутри приложений, называются ролями приложения .
В Oracle9i разработчикам приложений больше не нужно встраивать пароли в приложения для защиты ролей. Они могут создать роль приложения и указать, какой пакет PL/SQL авторизован включать эту роль. Такие роли приложения, включаемые пакетами PL/SQL, называются защищенными ролями приложения.
В пакете, реализующем защищенную роль приложения, должны выполняться следующие условия.
■ Приложение должно производить необходимую проверку. Например, приложение должно проверить то, что пользователь работает в определенном отделе, что сеанс пользователя был создан модулем прокси с определенного IP-адреса, а также то, что пользователь аутентифицирован при помощи сертификата Х.509. Для выполнения этой проверки приложение может использовать информацию о сеансе, которую можно получить с помощью функции SYS_CONTEXT ('среда_пользователя', <атрибут_сеанса>). Эта информация указывает способ, каким способом был аутентифицирован пользователь, IP-адрес клиента, а также то, подключается ли клиент через модуль прокси.
■ Приложение должно выполнить оператор SET_ROLE при помощи динамического SQL (DBMS_SESSION.SET ROLE).
...
Рейтинг: 0 / 0
Активность роли??? (SET ROLE)
    #33183369
Guest1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
 1 . Когда являются активными роли, назначенные пользователю ?

-- запрос выводит активные (DEFAULT) роли для
-- пользователя ИМЯ_ПОЛЬЗОВАТЕЛЯ
select *
from dba_role_privs t
where t.default_role = 'YES'
and (grantee = 'ИМЯ_ПОЛЬЗОВАТЕЛЯ' OR grantee = 'PUBLIC')

-- сделать активными роли для пользователя
-- Все доступные ему роли
alter user ИМЯ_ПОЛЬЗОВАТЕЛЯ default role ALL;
-- Выборочно
alter user ИМЯ_ПОЛЬЗОВАТЕЛЯ default role Роль1, Роль2;
-- Отменить все активные роли
alter user ИМЯ_ПОЛЬЗОВАТЕЛЯ default role NONE;


Код: plaintext
 2 . Как проверяются привилегии пользователя при компиляции и выполнении им пакета с AUTHID CURRENT_USER ?

При компиляции НЕ проверяются права на объекты, используемые в пакете.
При выполнении пользователь ДОЛЖЕН иметь все эти права.
Т.е. если в пакете есть что-то типа
select ID into ID_ from T1;
то в схеме пользователя должен быть объект (таблица, вьюха, синоним)
с таким именем и у него должно быть право на SELECT (если это чужой объект)


Код: plaintext
 3 . Что лучше использовать для динамической активации ролей: SET ROLE или DBMS_SESSION.SET_ROLE ?
Если необходимо обеспечить хороший уровень защиты,
то см. ответ Александра Соколова.
Лучше всего, чтобы у пользователя вообще не было активных ролей,
а они активировались при входе в приложение.
...
Рейтинг: 0 / 0
Активность роли??? (SET ROLE)
    #33183374
Guest1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Небольшая поправка к п.2
Объект может быть также в схеме PUBLIC.
...
Рейтинг: 0 / 0
Активность роли??? (SET ROLE)
    #33183411
Фотография Oleg Afanasiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Guest1Небольшая поправка к п.2
Объект может быть также в схеме PUBLIC.

PUBLIC это роль по умолчанию.
...
Рейтинг: 0 / 0
Активность роли??? (SET ROLE)
    #33183557
AciD_v
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот что я делаю:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
CREATE OR REPLACE PACKAGE ent_procurement.procurement_stopgap AUTHID CURRENT_USER AS
  FUNCTION getFinishingType(aUploadPoint NUMBER) RETURN FinishingType;
  FUNCTION getFinishingType(aUploadPoint VARCHAR2) RETURN FinishingType;
END;

CREATE OR REPLACE PACKAGE BODY ent_procurement.procurement_stopgap AS

  FUNCTION getFinishingType(aUploadPoint NUMBER) RETURN FinishingType IS
  pointName prod.division.name%TYPE;
  BEGIN
    SELECT name INTO pointName FROM prod.division -- ЗДЕСЬ БАГ
    WHERE num = aUploadPoint;
    RETURN getFinishingType(pointName);
  END;

  FUNCTION getFinishingType(aUploadPoint VARCHAR2) RETURN FinishingType IS
  finType SMALLINT;
  BEGIN
    finType := NULL;

    IF aUploadPoint IS NOT NULL THEN
      IF InStr(Upper(aUploadPoint), 'ÑÓØ',  1 ,  1 ) >  0  then
        finType :=  1 ;
      ELSIF InStr(Upper(aUploadPoint), 'ÏÎÄÐÀÁ',  1 ,  1 ) >  0  then
        finType :=  2 ;
      ELSE
        finType :=  0 ;
      END IF;
    END IF;

    RETURN finType;
  END;

END;
После выполнения команды создания пакета и его тела:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Create package body, executed in  0 . 188  sec.
 13  PLS- 00201 : identifier 'PROD.DIVISION' must be declared -- (см. выше)
 13  PL/SQL: Item ignored
 42  PL/SQL: ORA- 00942 : table or view does not exist
 5   PL/SQL: SQL Statement ignored
 29  PLS- 00320 : the declaration of the type of this expression is incomplete or malformed
 5   PL/SQL: Statement ignored
При этом пользователь (SYS), под которым выполняется скрипт, имеет привилегию SELECT из PROD.DIVISION, но через роль!
Получается, что все-таки на этапе компиляции проверяется доступ к обращаемым объектам!

Как быть?
...
Рейтинг: 0 / 0
Активность роли??? (SET ROLE)
    #33183559
Lotus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Guest1
1. Когда являются активными роли, назначенные пользователю
При компиляции НЕ проверяются права на объекты, используемые в пакете.
При выполнении пользователь ДОЛЖЕН иметь все эти права.


Если у создателя пакета нет достаточных прав на "чужой" объект, то тело пакета скомпилируется с ошибкой (PLS-00904) ...
...
Рейтинг: 0 / 0
Активность роли??? (SET ROLE)
    #33183578
Lotus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лично мне пришлось в данной ситуации использовать динамический SQL, вот тогда действительно разбор происходит в момент выполнения !!!!
...
Рейтинг: 0 / 0
Активность роли??? (SET ROLE)
    #33184277
AciD_v
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ладно, поставим вопрос подругому:

С привилениями какого пользователя компилируется пакет с AUTHID CURRENT_USER?

Почему под ВСЕМОГУЩИМ SYS'ом выпадпает ошибка компиляции:

Код: plaintext
1.
2.
PLS- 00201 : identifier 'PROD.DIVISION' must be declared -- (см. выше)
ORA- 00942 : table or view does not exist

??????? %-0
...
Рейтинг: 0 / 0
Активность роли??? (SET ROLE)
    #33184458
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AciD_v
Код: plaintext
1.
2.
3.
4.
  pointName prod.division.name%TYPE; -- на самом деле жук здесь
            ^^^^^^^^^^^^^
 123456789   123 

 13  PLS- 00201 : identifier 'PROD.DIVISION' must be declared

С привилениями какого пользователя компилируется пакет с AUTHID CURRENT_USER?RTFM How External References Are Resolved in Invoker-Rights Subprograms (FAQ)
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Активность роли??? (SET ROLE)
    #39307100
Ролевик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кто-то может привести реальный пример, когда имеет смысл использовать set role?

Именно SET ROLE, а не DBMS_SESSION.SET_ROLE.
Во втором случае какой-то смысл есть поскольку при включении через процедуру могут выполняться дополнительные проверки сеанса.

Но какой смысл пользователю самому себе отключать/ключать роли, которые ему уже грантованы?
...
Рейтинг: 0 / 0
Активность роли??? (SET ROLE)
    #39307103
Ролевик,

Например, для управления из приложения полномочиями по вводу пароля.
...
Рейтинг: 0 / 0
Активность роли??? (SET ROLE)
    #39307104
Ролевик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
мах_енабляд_ролез,

Что-то не догоняю, можно конкретнее?
...
Рейтинг: 0 / 0
Активность роли??? (SET ROLE)
    #39307154
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
РолевикИменно SET ROLE, а не DBMS_SESSION.SET_ROLE.Чудак, это одно и то же.
...
Рейтинг: 0 / 0
Активность роли??? (SET ROLE)
    #39307179
Ролевик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ElicРолевикИменно SET ROLE, а не DBMS_SESSION.SET_ROLE.Чудак, это одно и то же.Согласен, одно вызывает другое.

Всё равно возможность самому себе отключать/ключать роли кажется абсурдной.
Если соединение установлено, то пользователь может активировать все роли.
Зачем часть держать неактивными - чтоб не сделать глупостей? ))
...
Рейтинг: 0 / 0
Активность роли??? (SET ROLE)
    #39307211
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
РолевикВсё равно возможность самому себе отключать/ключать роли кажется абсурдной.
Если соединение установлено, то пользователь может активировать все роли.
Зачем часть держать неактивными - чтоб не сделать глупостей? ))

Ну и как пользователь может активировать все роли не используя SET ROLE? Если ты имеешь ввиду ALTER USER DEFAULT ROLE ALL, то можешь напороться на ORA-28031: maximum of 148 enabled roles exceeded. Кроме того, в 12C default password protected roles ужe не активируются при логине.

SY.
...
Рейтинг: 0 / 0
Активность роли??? (SET ROLE)
    #39307238
Ролевик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SYРолевикВсё равно возможность самому себе отключать/ключать роли кажется абсурдной.
Если соединение установлено, то пользователь может активировать все роли.
Зачем часть держать неактивными - чтоб не сделать глупостей? ))

Ну и как пользователь может активировать все роли не используя SET ROLE? Если ты имеешь ввиду ALTER USER DEFAULT ROLE ALL, то можешь напороться на ORA-28031: maximum of 148 enabled roles exceeded. Кроме того, в 12C default password protected roles ужe не активируются при логине.

SY.Я имею в виду именно включение с помощью set role.

Если провести параллель с реальным миром: есть пять комнат и некто имеет три ключа.
Но остальные два ключа при надобности он может запросить и тогда получит доступ ко всем комнатам.
Ну так какой смысл самому себе давать и забирать возможности?
При этом некто может активировать себе недостающие два ключа только если они были грантованы ему ранее.
...
Рейтинг: 0 / 0
Активность роли??? (SET ROLE)
    #39307244
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще раз для тех кто в танке. У юзера может быть сколько угодно ролей по умолчанию. У сессии только 148 активных ролей.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
SQL> create user u1 identified by u1;

User created.

SQL> grant create session to u1;

Grant succeeded.

SQL> begin
  2      for v_i in 1..150 loop
  3        execute immediate 'create role r' || v_i;
  4        execute immediate 'grant r' || v_i || ' to u1';
  5      end loop;
  6  end;
  7  /

PL/SQL procedure successfully completed.

SQL> select  count(*)
  2    from dba_role_privs
  3    where grantee = 'U1'
  4  /

  COUNT(*)
----------
       150

SQL> connect u1/u1@pdb1sol12
Connected.
SQL> select  count(*)
  2    from  session_roles
  3  /

  COUNT(*)
----------
       148

SQL>



Так что если понадобится рoль r149 и/или r150, то без SET ROLE не обойтись. А начиная с 12C:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
SQL> create user u1 identified by u1;

User created.

SQL> grant create session to u1;

Grant succeeded.

SQL> create role r1 identified by r1;

Role created.

SQL> grant r1 to u1;

Grant succeeded.

SQL> select  count(*)
  2    from dba_role_privs
  3    where grantee = 'U1'
  4  /

  COUNT(*)
----------
         1

SQL> connect u1/u1@pdb1sol12
Connected.
SQL> select  count(*)
  2    from  session_roles
  3  /

  COUNT(*)
----------
         0

SQL>



Так-что начиная с 12C с защищенными ролями без SET ROLE вообще не обойтись.

SY.
...
Рейтинг: 0 / 0
Активность роли??? (SET ROLE)
    #39307306
Ролевик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SYЕще раз для тех кто в танке. У юзера может быть сколько угодно ролей по умолчанию. У сессии только 148 активных ролей.Ок, это понятно. Но я просил реальный пример а не какие-то граничные случаи.
РолевикКто-то может привести реальный пример, когда имеет смысл использовать set role?
SYА начиная с 12CВот это разумно и вопросов не вызывает. Под одним пользователем могут ходить разные группы людей, привилегии которых определяются знанием дополнительных паролей.

Но set role в Орале уже более 10 лет, может объясните применение для более старых версий (кроме 148 ролей)?
...
Рейтинг: 0 / 0
Активность роли??? (SET ROLE)
    #39307307
РолевикНо остальные два ключа при надобности он может запросить и тогда получит доступ ко всем комнатам.Ключник попросит дыхнуть в алкотестер и не даст.
...
Рейтинг: 0 / 0
Активность роли??? (SET ROLE)
    #39307333
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SYТак-что начиная с 12C с защищенными ролями без SET ROLE вообще не обойтись.SY.С 11 http://docs.oracle.com/cd/E11882_01/network.112/e36292/authorization.htm#i14551 If the role is password authenticated or a secure application role, then you cannot grant it indirectly to the user, nor can you make it a default role. You only can grant this type of role directly to the user. Typically, you enable password authenticated or secure application roles by using the SET ROLE statement.



РолевикSYЕще раз для тех кто в танке. У юзера может быть сколько угодно ролей по умолчанию. У сессии только 148 активных ролей.Ок, это понятно. Но я просил реальный пример а не какие-то граничные случаи.
РолевикКто-то может привести реальный пример, когда имеет смысл использовать set role?
Код: plsql
1.
2.
3.
4.
5.
prod> select count(*) from dba_roles;

    COUNT(*)
------------
         281

Это БД одного приложения
Одновременно их все не включишь

РолевикПод одним пользователем могут ходить разные группы людей, привилегии которых определяются знанием дополнительных паролей.Зачем под одним, каждый под собой. Но роль общая. Возможно под паролем
И, как правило вводит его (и включает нужную роль) не юзер, а приложение
Скажем, когда юзер работает как администратор, то при запуске приложения "Администратор" включается (возможно, предоставляя пароль) роль XXX_ADMIN (и проверяется, что не включена XXX_USER).
...
Рейтинг: 0 / 0
Активность роли??? (SET ROLE)
    #39307681
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добавлю к тому что сказал Вячеслав - кстати, спасибо Вячеславу за уточнение версии с защищенными ролями. В большинстве приложений используются пулы подсоединий где одна и та же сессия бд используется различными сессиями приложения. Можно (и и IMHO нужно) использовать разные пулы для, скажем, администратора и рядового пользователя но часто вариаций рядового пользователя может быть достаточно много и тогда, по возвращении подсоединия в пул можно делать SET ROLE NONE а сессия приложения при запросе подсоединия из пула выполнит SET ROLE XXX,YYY,...

SY.
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Активность роли??? (SET ROLE)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]