powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle APEX [игнор отключен] [закрыт для гостей] / Помогите решить проблему: unauthorized access (security group package variable not set)
8 сообщений из 8, страница 1 из 1
Помогите решить проблему: unauthorized access (security group package variable not set)
    #37222315
Tol2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток!

Имеем Application Express 3.2.1.00.10.

Есть схема DBADMIN. Ей дадена роль apex_administrator_role.
Есть воркспейс с id xxx.

Есть такая функция в схеме DBADMIN:

create or replace function lock_user_apex(
username$ in varchar2,
lock$ in number, -- 0 - разблокировать, 1 - заблокировать.
block_reason$ out varchar2
) return number is
Result number(1):=0;
.....
pp_userid number;
begin
block_reason$:='';
WWV_FLOW_API.SET_SECURITY_GROUP_ID(p_security_group_id => xxx);
pp_userid:=apex_util.get_user_id(p_username => username$);
pp_locked:=apex_util.get_account_locked_status(p_user_name => username$);
.........
.........
.........
return(Result);
end lock_user_apex;

Засада в том, что, когда коннектишься к Ораклу под именем dbadmin (владельца функции), эта функция выполняется.
А вот если коннектишься под, скажем, юзером scott (которому, тем не менее, даны права на вызов dbadmin.lock_user_apex, то под ним вылазит такая вот ошибка: unauthorized access (security group package variable not set).
При том, что SET_SECURITY_GROUP_ID отрабатывает (не приводит к ошибке).
А к ошибке приводит строка pp_locked:=apex_util.get_account_locked_status(p_user_name => username$);
А в строке ранее pp_userid:=apex_util.get_user_id(p_username => username$); заметил, что под dbadmin получаем правильный pp_userid, а под scott получаем null.
Я сделал эту функцию и эту схему специально для того, чтобы неадмины (техподдержка) могли управлять юзеровскими эккаунтами. Не хочется юзерам типа скотта давать роль apex_administrator_role и иже с ними.
Может, кто-то мне скажет, что нужно делать в таком случае?
Ведь функция должна вызываться в таком контексте с правами создателя, т.е. схемы dbadmin, а не скотта...
Спасибо, что прочитали)
...
Рейтинг: 0 / 0
Помогите решить проблему: unauthorized access (security group package variable not set)
    #37222497
SvUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Такой вопрос, эта функция выполняется вне контекста апексовой сессии? В контексте апексовой сессии она работает?
Управление юзеровскими аккаунтами, так же происходит вне контекста c апексовой сессией, или есть страницы в apex-е?
...
Рейтинг: 0 / 0
Помогите решить проблему: unauthorized access (security group package variable not set)
    #37222864
SvUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
т.е. я поясню, дело действительно в ролях?
Если всё это вызывается снаружи, то в апексе могуты быть проблемы с вызовом некоторых функций из apex_util и SET_SECURITY_GROUP_ID отнюдь не всегда помогает.

Если всё это вызывается внутри, в стандартном механизме роли в апексе не применяются, т.к. все пользователи выполняют запросы под одним... под user вместо v('USER')
...
Рейтинг: 0 / 0
Помогите решить проблему: unauthorized access (security group package variable not set)
    #37222985
Tol2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SvUser,

Все вызывается вне апекса, из дельфовой программы или из пл/скл девелопера.
Просто в предыдущих версиях апекса оно вообще не хотело работать вне апекса, даже с сет_секурити_айди. А в этом появилась роль apex_administrator_role и заработало все вне контекста.
Да, вот только что проверил: если юзеру scott дать роль apex_administrator_role, то, подконнектившись как scott, успешно выполняем процедуру dbadmin.lock_user_apex. А если эту роль у скотта забрать, то вызов этой процедуры вываливается с ошибкой авторизации. Но я спецом для этого и создал схему dbadmin, чтобы роль дать именно ей, а не скотту, а скотту дать право только выполнять процедуру. С просто Ораклом как СУБД такое работает, т.е. dbadmin имеет право блокировать/разблокировать юзера, а скотт не имеет, и тем не менее, он вызывает dbadmin.lock_user и может блокировать/разблокировать. А вот с апексом такое не проходит (((
Что делать?.. В крайнем случае, конечно, дам скотту apex_administrator_role. Но это не выход, он тогда сможет творить че захочет)
...
Рейтинг: 0 / 0
Помогите решить проблему: unauthorized access (security group package variable not set)
    #37227376
Tol2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Молчит народ... :)
Если кому-то интересно, я нарыл вот что: посмотрел, что это за роль, apex_administrator_role.
Единственное, что есть у этой роли, это право на вызов apex_030200.wwv_flow_instance_admin.
А так как в этом пакете есть такая функция, как, скажем, remove_workspace, то я как-то сильно против, чтобы давать право на этот пакет скотту или техподдержке.

Провел небольшой эксперимент, а именно:
grant apex_administrator_role to scott;
revoke execute on apex_030200.wwv_flow_instance_admin from apex_administrator_role;
Теперь у скотта роль есть, а фактических прав нет :)
Результат: у скотта все работает!! Т.е. скотт может теперь вне среды Апекса, под своим именем спокойно блокировать/разблокировать юзеров воркспейса, и я не боюсь за то, что он что-то глобально напортит в этом воркспейсе или в других.

Отсюда простой как гвоздь вывод:
Апекс тупо проверяет на то, чтобы у юзера, вызывающего, скажем, apex_util.get_account_locked_status или apex_util.lock_account, была роль apex_administrator_role. Если этой роли у юзера нет, самим же Апексом генерится ошибка.
_Даже_ если юзер делает все это через вызов обрамляющего пакета/процедуры, в данном случае через мою dbadmin.lock_user_apex, которая уже сама вызывает apex_util.get_account_locked_status и обладает всеми для этого необходимыми правами, все равно права должны быть именно у того, кто вызывает. Как-то нехорошо это. Получается выполнение с правами вызывающего, а не создателя, как нужно было бы по умолчанию.

Теперь, хоть и проблема решена, как говорится, напильником, путем подпиливания роли apex_administrator_role, я не горю желанием переносить ее на продакшн сервер по той причине, что в последующих версиях апекса, скорее всего, роли apex_administrator_role дадутся еще какие-то глобальные привилегии супер админа, и надо будет подпиливать эту роль по новой, не говоря уже о том, что apex_administrator_role может реально понадобится кому-то неподпиленной.
Т.е. как-то нехорошо, что для управление юзерами воркспейса нужны такие права, которые позволят этот самый воркспейс даже удалить, и вообще рулить всеми остальными воркспейсами, т.е. права мегаадмина.
Быть может, в 4м апексе это подправили, а может, это фича такая. В общем, где-то так.
Если есть соображения - высказывайте. Я думаю, программно рулить юзерами воркспейса, дело очень нужное многим, кто использует Апекс.
...
Рейтинг: 0 / 0
Помогите решить проблему: unauthorized access (security group package variable not set)
    #37236309
SvUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за объяснения, про роль apex_administrator_role не знал, нужно будет опробовать.
Я так понимаю, если давать пользователю роль apex_administrator_role и делать revoke таким образом, то опять же пользователь сможет вызывать и другие нежелательные функции таким же образом, какие захочет. Т.е. изначальная цель не достигнута.
И задача сводится к предыдущей, вызвать эту функцию без применения этой роли.

Встречался с таким подготовительным кодом, какие-то функции вроде как работали благодаря этому до какой-то версии, вдруг поможет, хотя честно говоря сомневаюсь :)
Код: 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.
DECLARE 
 l_cgivar_name owa.vc_arr;
 l_cgivar_val owa.vc_arr; 
 CURSOR get_workspace_id IS
 SELECT workspace_id 
 FROM apex_applications
 WHERE application_id = l_application_id;
 BEGIN 
 -- Set Environment variables to allow running of APEX job remotely
 -- Page 507 Must be public
 FOR b in get_workspace_id LOOP
 l_workspace_id := b.workspace_id;
 END LOOP;
 htp.init;
 l_cgivar_name( 1 ) := 'REQUEST_PROTOCOL';
 l_cgivar_val( 1 ) := 'HTTP';
 owa.init_cgi_env(
 num_params =>  1 ,
 param_name => l_cgivar_name,
 param_val => l_cgivar_val );
 wwv_flow_api.set_security_group_id(l_workspace_id);

 apex_application.g_instance := wwv_flow_custom_auth.get_next_session_id;
 apex_application.g_flow_id := l_application_id;
 apex_application.g_flow_step_id := l_application_id;
-- Call function
...

Ну а вообще, я бы предложил попытаться посмотреть под другим углом.
Cтандартное решение - реализовать страницы управления/блокировками пользователей внутри APEX. Внутри толстого клиента, можно вшить коннект под dbadmin. Другой вариант - тщательнее подбирать схемы аутентификации. Если при аутентификации использовать пользователей и средства oracle, а не apex, то таких проблем не возникнет. Либо написать свою схему аутентификации, это предполагает и релизацию средств блокирования/разблокирования пользователей, которыми можно пользоваться снаружи.
...
Рейтинг: 0 / 0
Помогите решить проблему: unauthorized access (security group package variable not set)
    #37236364
SvUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всё пытался найти время опробовать этот код самостоятельно, но так и не нашлось возможности опробовать его.
В качестве схем аутентификации у меня обычно используются именно последние 2 и таких проблем не возникает.
...
Рейтинг: 0 / 0
Помогите решить проблему: unauthorized access (security group package variable not set)
    #37236701
Tol2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SvUser,

Ага, я так понимаю, тут апекс пытаются обмануть, сказав ему, что он работает в среде веб-интерфейса, что ли?.. Создать каку-то среду вызова... Не совсем понял, если честно.
Но у меня проблема была именно в роли, поскольку: дал - заработало, отнял - перестало работать :)
Вообще, я писал не про то, чтобы давать роль до и отнимать ее сразу после, а про то, чтобы у самой роли забрать опасные привилегии, т.к. Апексу не важно, что дано этой роли, а важно лишь то, что роль с таким названием есть у юзера, под которым коннект к БД. Но там коряво, бо в след. версии Апекса этой роли может быть дадено еще что-то опасное, да и кромсать системную роль - это не дело все-таки.
Мне тут подсказали про вот что:
Oracle предлагает такой механизм, как Secure
Application Roles - возможность в открытом сеансе пользователя,
устанавливать ему роль путем запуска в приложении специальной
процедуры, ассоциированной с этой ролью. См. документацию -
http://download.oracle.com/docs/cd/E11882_01/server.112/e10575/tdpsg_privileges.htm#TDPSG30032
http://download.oracle.com/docs/cd/E11882_01/network.112/e16543/app_devs.htm#i1006262
Не читал еще, попробую, может это то, что нужно... Если речь идет о том, чтобы конкретной сессии временно назначить какую-то роль...
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Oracle APEX [игнор отключен] [закрыт для гостей] / Помогите решить проблему: unauthorized access (security group package variable not set)
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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