powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle APEX [игнор отключен] [закрыт для гостей] / Как правильно использовать page sentry function
8 сообщений из 8, страница 1 из 1
Как правильно использовать page sentry function
    #37511904
rockclimber
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Перерыл уже весь интернет, но почему-то нигде не написано то, что мне нужно.
Итак. Есть кастомная схема аутентификации, созданная по вот этому мануалу. Работает просто замечательно. Все понятно, вопросов нет.
Теперь я хочу сделать так, чтобы некоторые страницы могли видеть не все зарегистрированные пользователи, а только избранные. Я сделал таблички и запросы, позволяющие определять доступность страницы для пользователя.
Для контроля всего процесса сделал таблицу logs со столбцами user, page, message и т. д. и функцию, которая пишет логи в эту таблицу (у меня apex на хостинге). Для определения текущего пользователя использую функцию APEX_CUSTOM_AUTH.GET_USER, для определения страницы - APEX_APPLICATION.G_FLOW_STEP_ID.
И вот какой результат получается.
Пока не используется page sentry function, лог выглядит так:
Неизвестный пользователь зашел на страницу 101 (стандартная страница логина)
Неизвестный пользователь успешно прошел аутентификацию
Пользователь VASYA зашел на страницу 25 (на эту страницу меня стоит редирект после логина).
И т. д.

Теперь я добавляю вызов моей функции для определения, кто какую страницу может видеть. Лог выглядит так:
Неизвестный пользователь зашел на страницу 101 (стандартная страница логина)
Неизвестный пользователь успешно прошел аутентификацию
Неизвестный пользователь зашел на страницу 1, доступ запрещен
Неизвестный пользователь зашел на страницу 1, доступ запрещен
Последнее сообщение идет два раза почему-то.

То есть при использовании page sentry function и без ее использования функция APEX_CUSTOM_AUTH.GET_USER возвращает разный результат.
Что я делаю не так? Или я вообще все не так делаю?
...
Рейтинг: 0 / 0
Как правильно использовать page sentry function
    #37512454
SvDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rockclimber,

А где и каким образом вы пишите логи?
То есть, если раньше page sentry function вернула false, то в чем криминал?
По поводу двойного вызова:
Код: plaintext
If this function returns false (indicating perhaps that the user isn't logged in), this marks the session as not valid and the behavior defined in 'Session Not Valid > Go To' will be invoked.
...
Рейтинг: 0 / 0
Как правильно использовать page sentry function
    #37512500
rockclimber
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SvDevrockclimber,

А где и каким образом вы пишите логи?У меня есть такая процедура:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
create or replace procedure "MAKE_LOG"
(p_place IN VARCHAR2,
p_log_text IN VARCHAR2)
is
begin
insert into logs(LOG_TEXT, USERNAME, PAGE_NUMBER, PLACE, event_time)
values (P_LOG_TEXT, APEX_CUSTOM_AUTH.GET_USER, to_char(APEX_APPLICATION.G_FLOW_STEP_ID), P_PLACE, current_timestamp);
end; ​
В процедуру я передаю два параметра: место, откуда вызываю, и какое-нибудь сообщение.

Вот примеры вызовов.
Процедура логина:
Код: 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.
create or replace procedure "A_LOGIN"
(p_uname  VARCHAR2,
 p_password VARCHAR2,
 p_session_id VARCHAR2,
 p_flow_page VARCHAR2)
is
    p_page varchar2( 100 );
BEGIN
   p_page := p_flow_page || ':25';

make_log('login proc', 'login attempt, redirect to page ' || p_page);

  wwv_flow_custom_auth_std.login 
 (
  p_uname => p_uname,
  p_password => p_password,
  p_session_id => p_session_id,
  p_flow_page => p_page
  );
EXCEPTION
WHEN OTHERS
THEN 
 RAISE;
END;
Текст взят из того мануала, который в первом посте упоминается.

Второй пример:
Функция проверки логина и пароля:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
create or replace function "A_CLIMB_AUTH"
(p_username in VARCHAR2, p_password in VARCHAR2)
return BOOLEAN
is
  tmp_res number;
  CryptedPWD varchar2( 32 );  
begin
  CryptedPWD:=DBMS_OBFUSCATION_TOOLKIT.md5(input_string => p_password);

  select  1  
    into tmp_res 
    from climbers 
   where login = upper(p_username) 
     and pwd = CryptedPWD;
 
make_log('auth function', 'auth result: ' || to_char(tmp_res));

return (tmp_res =  1 );

  exception
  when no_data_found then
  return false;  
end;​

Третий пример:
Функция проверяет. имеет ли пользователь доступ к указанному объекту.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
create or replace function "A_CHECK_OBJECT_ACCESS"
(p_object_name in VARCHAR2)
return BOOLEAN
is
    rec_cnt integer;
begin
    select count(*)
      into rec_cnt
      from a_access_objects ao
         , a_action_of_roles actsr
         , climbers cl
     where cl.role_id = actsr.role_id
       and actsr.action_id = ao.action_id
       and cl.login = upper(APEX_CUSTOM_AUTH.GET_USER)
       and ao.object_name = p_object_name;

make_log('check access function', 'object: ''' || p_object_name || ''', result of check is ' || to_char(rec_cnt));

    return (rec_cnt >  0 );

    exception
        when no_data_found then return false;
end;​
У меня на некоторых страницах есть элементы (столбцы отчетов, кнопки, ссылки и т. п.), которые я хочу показывать не всем пользователям. Вот эта третья функция по названию объекта определяет, показывать его пользователю или нет.

Четвертый пример (page sentry function):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
create or replace function "A_SENTRY"
(p_user in VARCHAR2 default 'APEX_PUBLIC_USER')
return BOOLEAN
is
    res boolean;
    resstr varchar2( 15 );
    pg_id integer;
begin
    pg_id := APEX_APPLICATION.G_FLOW_STEP_ID;
    res:=A_CHECK_OBJECT_ACCESS('P' || to_char(pg_id));
    if res then
        resstr := 'allowed';
    else
        resstr := 'denied';
    end if;
make_log('sentry function', 'p_user: ''' || APEX_CUSTOM_AUTH.GET_USER || ''' tried to get access to page ' || 
    to_char(pg_id)|| ', access: ' || resstr);
return res;
end;​


Все эти функции работают правильно - я их тестировал отдельно каждую, вызывая в разделе SQL Commands.
В итоге работает все так. Пользователь заходил на страницу логина, вводит логин и пароль, вызываются функции из примеров 1 и 2, и они пишут в лог, что зашел неизвестный пользователь, ввел логин и пароль, проверка прошла успешно. Потом пользователь перенаправляется на страницу 25 (это стартовая в моем приложении), при подготовке страницы вызывается функция из третьего примера, которая проверяет, можно ли пользователю видеть один из столбцов отчета на этой странице. Так в логе появляется запись, что пользователь VASYA побывал на 25-й странице и столбец в отчете ему не доступен.


SvDevТо есть, если раньше page sentry function вернула false, то в чем криминал?Если page sentry function вернула false, то криминала нет. Криминал в том, что у меня page sentry function возвращала бы true, если бы функция APEX_CUSTOM_AUTH.GET_USER возвращала бы логин пользователя. Вместо этого в логе я вижу, что page sentry function сразу после процедуры аутентификации вызывает функции APEX_CUSTOM_AUTH.GET_USER и APEX_APPLICATION.G_FLOW_STEP_ID, получая от них NULL и 1 соответственно. Поэтому получается следующее: если я использую page sentry function, то попадаю на страницу 1, получаю сообщение, что такой страницы нет (ее действительно нет), руками правлю url, чтобы попасть на 25-ю страницу, попадаю туда и вижу, что я не залогинился.
Тут, кстати, если еще одна проблема: если я не использую page sentry function, то редирект на страницу 25 работает тоже не всегда, иногда меня посылает на 1-ю страницу. А если с первой перейти потом на 25-ю, я остаюсь залогиненым.
...
Рейтинг: 0 / 0
Как правильно использовать page sentry function
    #37512550
SvDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
т.е. проблема в том, что не получается зайти на первую же страницу.

Пробую в 4.1 и всё работает, заходит сразу же на страницу 2 (home page), где page requires authentication:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
function sentry_test
return boolean
as
begin
 if ((APEX_CUSTOM_AUTH.GET_USER in ('ADMIN') 
      or APEX_CUSTOM_AUTH.CURRENT_PAGE_IS_PUBLIC)
     and APEX_APPLICATION.G_FLOW_STEP_ID !=  3 ) then
   return true;
 else
   return false;
 end if;
end;
Это под админом, под остальными, как положено, выбрасывает сразу же на логин.

Впрочем поведение 4.1 от старых версий при аутентификации может отличаться, уже напарывался.
...
Рейтинг: 0 / 0
Как правильно использовать page sentry function
    #37512957
SvDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Один прикол вижу, если sentry_test вернула false, скажем на странице 3, выбрасывает на логин, после логина он снова пытается законнектиться к странице 3 (видимо в кукисах где-то сохранилось), снова выбрасывает на логин и т.п. А если удалить часть строки адреса с сессией, то он снова начинает нормально логиниться к стр 2. Это конечно можно вылечить, если покопаться.

Для регулирования доступа к страницам всё-таки следует использовать схемы авторизации.
...
Рейтинг: 0 / 0
Как правильно использовать page sentry function
    #37512967
rockclimber
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SvDevДля регулирования доступа к страницам всё-таки следует использовать схемы авторизации.Да? А как, где про это можно что-нибудь толковое почитать? Я просто читал, что для этой цели как раз и созданы page sentry function. По крайней мере, я так понял.
Днем написал письмо на хостинг, чтобы проапгрейдили до 4.1, жду пока...
...
Рейтинг: 0 / 0
Как правильно использовать page sentry function
    #37512971
SvDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rockclimber, как я понимаю sentry function предназначена для управлением состоянием аутентификации, например задать для сессии ограничения по времени или по квотам, и т.д.

По Authorization Scheme там в подсказках все написано, создаешь и указываешь в свойствах страницы или компонентам.
Это куда удобнее и не надо отдельные условия придумывать.
...
Рейтинг: 0 / 0
Как правильно использовать page sentry function
    #37515486
rockclimber
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SvDevrockclimber, как я понимаю sentry function предназначена для управлением состоянием аутентификации, например задать для сессии ограничения по времени или по квотам, и т.д.

По Authorization Scheme там в подсказках все написано, создаешь и указываешь в свойствах страницы или компонентам.
Это куда удобнее и не надо отдельные условия придумывать.Да, вчера перенес свою "sentry function" в кастомную Authorization Scheme и получил ровно тот эффект, который был нужен. Просто книжку про все это читал давно и половину не понял...
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Oracle APEX [игнор отключен] [закрыт для гостей] / Как правильно использовать page sentry function
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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