Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle APEX [игнор отключен] [закрыт для гостей] / Просьба к SvDev / 6 сообщений из 6, страница 1 из 1
14.03.2016, 11:43
    #39191238
blkangel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Просьба к SvDev
Пишу Sentry функцию для кастомной атворизации, все практически работает.
Можете мне пример Вашей функции привести?
...
Рейтинг: 0 / 0
14.03.2016, 15:58
    #39191520
SvDev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Просьба к SvDev
blkangel,

Пример есть в help-е начиная с 4.2:



function sentry_basic_auth
return boolean
is
c_auth_header constant varchar2(4000) := owa_util.get_cgi_env('AUTHORIZATION');
l_user_pass varchar2(4000);
l_separator_pos pls_integer;
begin
if apex_application.g_user <> 'nobody' then
return true;
end if;

if c_auth_header like 'Basic %' then
l_user_pass := utl_encode.text_decode (
buf => substr(c_auth_header, 7),
encoding => utl_encode.base64 );
l_separator_pos := instr(l_user_pass, ':');
if l_separator_pos > 0 then
apex_authentication.login (
p_username => substr(l_user_pass, 1, l_separator_pos-1),
p_password => substr(l_user_pass, l_separator_pos+1) );
return true;
end if;
end if;

return false;
end sentry_basic_auth;

and within 'Sentry Function'

sentry_basic_auth


+ за примерами можно полазить в код по плагинам:

http://apex-plugin.com/oracle-apex-plugins/authentication-plugin.html

ну или в интернете:

https://community.oracle.com/thread/2355817?start=0&tstart=0

я стараюсь избегать использования sentry ввиду повышенной вероятности того, что где-нибудь сломается с новой версией,
там на каждый чих есть свой другой атрибут (например, Security Attributes > Initialization PL/SQL Code и др.), поэтому её используют в основном для аутентификации basic, ntlm, да Session Joining, если ниже 5-ки, чего мне пока было не нужно.

P.S. тут есть много участников с высокой квалификацией, не стоит адресовать вопрос лично ко мне, если есть именно личные вопросы именно ко мне (например, вопросы по разработкам которыми я уже делился) пишите на почту в профиле, она у меня всегда открыта.
...
Рейтинг: 0 / 0
14.03.2016, 16:39
    #39191557
blkangel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Просьба к SvDev
Сколько я гуглил в нете, примеры есть, но все видимо для более ранних версий.

SvDevну или в интернете:

https://community.oracle.com/thread/2355817?start=0&tstart=0

Относится к версии 4.1, как Вы правильно заметили, с каждой версией механизм меняется, и для 4.2 уже не подходит.



SvDevP.S. тут есть много участников с высокой квалификацией, не стоит адресовать вопрос лично ко мне, если есть именно личные вопросы именно ко мне (например, вопросы по разработкам которыми я уже делился) пишите на почту в профиле, она у меня всегда открыта.
Виноват, исправлюсь.
...
Рейтинг: 0 / 0
14.03.2016, 19:14
    #39191707
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Просьба к SvDev
Код: sql
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.
begin
    LOGDB('----------------------------------------------------------');
    l_cookie_sid := apex_custom_auth.get_session_id_from_cookie;
    GET_COOKIES_SSO(l_sso_username, l_sso_userFIO);
    LOGDB('---, a.cookie_sid\g_user\user\l_sso_username:       ' ||l_cookie_sid||'\'||apex_application.g_user||'\'||user||'\'||l_sso_username);
    if apex_custom_auth.is_session_valid and (length(l_sso_username) > 0) then
        LOGDB('session valid and a.get_username '|| apex_custom_auth.get_username);
        return true;
    else
        LOGDB('session no valid');
        if length(l_sso_username) > 0 then
          APEX_CUSTOM_AUTH.DEFINE_USER_SESSION (l_sso_username, 
                    APEX_CUSTOM_AUTH.GET_NEXT_SESSION_ID);
          LOGDB('return true; = reload');
          return true;
        elsif length(apex_application.g_user) > 0 then
          LOGDB('return true; = loginForm - вход через ф.логин (api.login(name,pass))');
          -- делаем сессию валидной
          return true;
        else
          LOGDB('return false; = loginForm');
          -- обнулить всё что можно
          APEX_UTIL.CLEAR_APP_CACHE(CONST_APPID);
          apex_authorization.reset_cache;
          return false;
        end if;
    end if;
end;
/
...
Рейтинг: 0 / 0
14.03.2016, 21:10
    #39191777
SvDev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Просьба к SvDev
blkangel,

В общем примеры накидали, если решения не найдется, чтобы обсуждать дальше нужны: описание задачи, код, сценарий при котором что-то не работает, точная версия апекс и выкладка из апекс дебага =
...
Рейтинг: 0 / 0
15.03.2016, 09:26
    #39191919
blkangel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Просьба к SvDev
Вроде заработала как надо. Надо наверное пояснить что делает.
1. Эта функция для кастомной авторизации.
2. Если у Вас есть действующая сессия, то можно открыть ссылку без номера/или не действующим уже номером сессии в этом приложении, то сессия автоматически подцепиться и Вы откроете страницу.
3. Так же если Вы открываете ссылку, например 320 страницу, а действующей сессии нет, то Вас сначала кинет на страницу авторизации, а потом на нужную страницу.

P.S. Чтобы открыть нужный номер страницы, на ней должен быть включен Deep Linking = Enable.
P.S.S Протестировано на версиях Апекса 4.2.2-4.2.6

Если кто то воспользуется и обнаружит глюки, буду благодарен, что отпишется.

Код: 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.
40.
41.
42.
43.
44.
45.
46.
47.
function page_sentry (p_apex_user in varchar2 default 'APEX_PUBLIC_USER' ) return boolean is
	l_cgi_var_name              varchar2(100) := 'REMOTE_USER';  
	l_authenticated_username    varchar2(256) := upper(owa_util.get_cgi_env(l_cgi_var_name));  		
	--
	l_current_sid								number;

Begin
	if user != upper(p_apex_user) then
		return false;
	end if;	
	if l_authenticated_username is null  then  
		return false;   
	end if;  	

	l_current_sid := apex_custom_auth.get_session_id_from_cookie;
	if apex_custom_auth.is_session_valid then
		apex_application.g_instance := l_current_sid;
		if l_authenticated_username=apex_custom_auth.get_username then
			apex_custom_auth.define_user_session(  
				p_user=>l_authenticated_username,  
				p_session_id=>l_current_sid
			);
			return true;
		elsif apex_application.g_user = 'nobody' then
			l_current_sid:=apex_custom_auth.get_next_session_id;
			apex_custom_auth.define_user_session(
				p_user=>l_authenticated_username, 
				p_session_id=>l_current_sid
			);				
			return false;
		else	
			apex_custom_auth.define_user_session(  
				p_user=>apex_custom_auth.get_username,  
				p_session_id=>l_current_sid
			);				
			return true;
		end if;
		return true;
	else
		l_current_sid:=apex_custom_auth.get_next_session_id;
		apex_custom_auth.define_user_session(
			p_user=>l_authenticated_username, 
			p_session_id=>l_current_sid
		);
		return false; 		
	end if; 
End page_sentry;

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


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