powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle APEX [игнор отключен] [закрыт для гостей] / Возможность регистрации новых пользователей
4 сообщений из 4, страница 1 из 1
Возможность регистрации новых пользователей
    #36600920
Mr.Artche
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день!
Помогите пожалуйста с решенные проблемы.
Нужно реализовать возможность регистрации новых пользователей (так как на разных сайтах, форумах)
И вообще можно реализовать это?
Спасибо за любую совет в решены данной проблемы.
...
Рейтинг: 0 / 0
Возможность регистрации новых пользователей
    #36601873
John Edward Scott - Pro Oracle Application Express
там есть раздел
Automating User Registration

описано ВСЕ шаг за шагом до мельчайших деталей
...
Рейтинг: 0 / 0
Возможность регистрации новых пользователей
    #36602193
Mr.Artche
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо за помощь. В статье довольно неплохо рассказано как реализовать данную проблему в жизни.
Для тех кто тоже столкнется с данной проблемой, хочу перевести ее с английского и разместит в этом же разделе.
...
Рейтинг: 0 / 0
Возможность регистрации новых пользователей
    #36603280
Mr.Artche
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Автоматизированная регистрация пользователей

Многие приложения позволяют новым пользователям регистрироваться без ручного вмешательства администратора.
Как правило, процесс регистрации содержит следующую последовательность шагов:

1. Пользователь вводит детали в форме, в том числе адрес электронной почты.
2. Сообщения отправляется на адрес электронной почты, которая была предоставлена. Это сообщение дает или код, который пользователю необходимо ввести на странице, либо содержит ссылку, пользователь должен нажать для подтверждения аккаунта.
3. После успешной проверки пользователь получит возможность подтвердиться приложении.

Вы можете реализовать автоматическую регистрацию пользователя следующими способами:

• Создание записи непосредственно в таблице user_repository и использование флажка для определения, аккаунт был подтвержден.
• Создание записи в таблице ожидания (holding table) и вставка его в таблицу user_repository, как только пользователь ответил на почтовое письмо для подтверждения.

Какой метод вы используете, зависит от ваших потребностей. Если вы считаете, что многие люди будут регистрироваться, но потом не отвечать на письмо подтверждения, Вы можете использовать таблицу ожидания. Это позволит избежать в конечном итоге большого количества неподтвержденных записей в таблице user_repository, которые может повлечь за собой медленную работу за необходимости поиска через несколько записей, когда пользователи пытаются залогиниться. Или вы можете предпочесть созданию записи непосредственно в таблице user_repository, так что вам не придется пройти через процесс копирования записи из таблицы ожидания в таблицу user_repository, а затем удаление этой записи из таблицы ожидания.
Создание записи непосредственно в таблице user_repository имеет некоторые другие выгоды. Вы можете использовать флажок, чтобы указать, или запись был подтвержден. Если вы также сохраняете время, когда запись был создан, вы можете использовать запланированное задание, чтобы удалять записи, которые не были проверены в течение определенного периода (например, в течение 48 часов) - таким образом у Вас не будет большого количества неподтвержденных записей в базе. Кроме того, можно воспользоваться функциями, такими как секционирования таблиц, чтобы подтвержденные записи хранились в одном разделе, а неподтвержденные - в другом. В таком случае запрос в Вашей функции аутентификации выиграет от необходимости искать только в одном разделе - подтвержденных записей (если только Вы не хотите выдавать сообщение «Ваш аккаунт не подтверждено».
Для демонстрации давайте пройдем через процесс разрешения регистрации пользователя в приложении Buglist. Хотя эта функциональность может быть в действительности непрактичной для этого приложения, эти же методы применяются к другим приложениям.

Модификация репозитория пользователей

Первый шаг состоит в изменении таблицы user_repository - следует добавить поле verified_flag.

- Добавляем новый столбец «verified (проверено)» в таблицу
Код: 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.
apex> alter table user_repository 
 2  add (verified char ( 1 )); 

Table altered. 

- Заполняет данными столбец соответствии содержимого таблицы 

apex> update user_repository 
set verified = 'N' where username = 'john'; 

 1  row updated. 

apex> update user_repository 
set verified = 'Y' where username <> 'john'; 

 2  rows updated. 

apex> commit; 

Commit complete. 

- Добавить не нулевое ограничение на новый столбец 

apex> alter table user_repository 
 2  modify verified not null; 

Table altered. 

- Добавить проверочное ограничение до колонку 

apex> alter table user_repository 
 2  add constraint verified_yn check (verified in ('Y', 'N')); 

Table altered. 
Модификация метода проверки подлинности

Теперь вам нужно немного изменить pkg_auth.authenticate, чтобы учитывать метку о подтверждении
Код: 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.
35.
36.
37.
38.
create or replace package body "pkg_auth" as 
function md5hash (p_input in varchar2) return varchar2 is 
begin 
return upper (dbms_obfuscation_toolkit.md5 (input => utl_i18n.string_to_raw (p_input))); 
end md5hash; 
function authenticate (p_username in varchar2, 
p_password in varchar2) return boolean is 
v_locked_flag char ( 1 ); 
v_verified char ( 1 ); 
v_hash varchar2 ( 32 ); 

begin 
v_hash: = md5hash (p_username | | p_password. 
select locked_flag, verified into v_locked_flag, v_verified 
  from user_repository 
where upper (username) = upper (p_username) 
    and upper (password_hash) = v_hash; 

- Если аккаунт не подтвержден, то послать сообщение о результате залогинення ('login_message') 
- И «аутентификация провалена» 

if v_verified = 'N' then 
apex_util.set_session_state ('login_message', 'your account has not been verified yet'); 
return false; 
else 
if v_locked_flag = 'N' then 
return true; 
else 
apex_util.set_session_state ('login_message', 'your account is locked'); 
return false; 
end if; 
end if; 
exception 
when no_data_found then 
apex_util.set_session_state ('login_message', 'invalid username or password'); 
return false; 
end authenticate; 
end; 
Теперь, если вы попытаетесь войти в систему под учетной записью, не был подтвержден (проверить столбец, содержащий 'N'), вы получите сообщение «your account has not been verified yet»

Создание Регистрационной формы

Далее вам необходимо создать простую регистрационную форму, где пользователи могут ввести свои данные для хранения в таблице user_repository.

Добавление Таблицы ссылку на подтверждение
Создать дополнительные таблицы для хранения ссылки на подтверждение, которое будет отправлено пользователю. Теоретически можно хранить ссылки на подтверждение в таблице user_repository, однако ссылкой на подтверждение должно использоваться только в процессе регистрации, поэтому, наверное, нет необходимости загромождать таблицу user_repository этими данными.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
apexd> create table verification_link ( 
username varchar2 ( 8 ) not null, 
registered timestamp, 
verification_code raw ( 16 ), 
primary key (username)); 

Table created. 
Вы сохраняете время, когда пользователь зарегистрировал аккаунт, в поле регистрации. Это поле может быть использовано в процедуре удаления учетных записей, которые не были подтверждены в течение определенного времени.

Добавление процедуры регистрации пользователя

Добавьте процедуру register_user в пакет pkg_auth. Эта процедура будет вставлять данные пользователя в таблицу user_repository, а также генерировать ссылку на подтверждение этого участника и отправлять его по почте.
Код: 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.
35.
36.
37.
38.
39.
40.
41.
42.
 
procedure register_user (p_username in varchar2, 
p_password in varchar2, 
p_forename in varchar2, 
p_surname in varchar2, 
p_email in varchar2) is 
v_hash varchar2 ( 32 ); 
v_code raw ( 32 ); 
begin 
- Генерации хэш пароля пользователя 
v_hash: = md5hash (upper (p_username) | | p_password. 
- Генерировать ссылкой для подтверждения, которое будет использовано 
v_code: = md5hash (p_username | | dbms_random.string ('A',  8 )); 
insert into verification_link 
(Username, 
registered, 
verification_code) 
values 
(P_username, 
sysdate, 
v_code. 
- Сохранение новой учетной записи в таблице user_repository 
- Учетная запись сохраняется разблокированным и неподтвержденным 
insert into user_repository 
 (Username, 
forename, 
surname, 
email, 
password_hash, 
locked_flag, 
verified) 
values 
(P_username, 
p_forename, 
p_surname, 
p_email, 
v_hash, 
'N', 
'N'); 
- Отправить сообщение с подтверждением 
send_verification_email (p_username, p_email, v_code. 
end register_user; 

В этой процедуре используется следующий код в формировании проверки ссылка:
Код: plaintext
1.
v_code: = md5hash (p_username | | dbms_random.string ('A',  8 )); 
Здесь использована та же вспомогательная функция md5hash, которая использовалась для создания хэша MD5 пользовательского пароля. Однако в этом случае, вы используете ее для создания ссылки на подтверждение, основанное на имени пользователя и случайный набор символов (созданном с помощью dbms_random.string. Пожалуй, то, что выводит функция dbms_random.string, легче визуализировать на примере:
Код: plaintext
1.
apex> select dbms_random.string ('A',  8 ) as X from dual; 
Вы отправляете случайный строчку в конец имени пользователя, прежде чем оно передается функции md5hash таким образом, чтобы лесостепной ссылку на подтверждение было сложнее вывести. Это может быть очень важно при автоматизированной процедуре регистрации, где вы хотите предупредить создании аккаунта автоматизированным инструментом, написанным злоумышленником.
Здесь мы собираемся изменить страницу регистрации пользователей и добавить процесс страницы PL / SQL, который вызывает процедуру pkg_auth.register_user, используя как параметры элементы страницы, когда пользователь нажимает на кнопку «Зарегистрироваться». Обратите внимание, что вы можете изменить переменную c_base_url, чтобы показать полный URL, которую должен использовать пользователь.
Хотя вы можете отправить простое, однолинейная сообщения из тела процедуры register_user, мы вставим фактическую отправку ссылки на подтверждение по электронной почте в отдельную процедуре, чтобы мы могли отправить красиво отформатированный текст по электронной почте. Вы можете даже расширить пример, чтобы отправить HTML-форматирования сообщения электронной почты, а не обычное текстовое сообщение, используя параметр P_BODY_HTML в процедуре APEX_MAIL.

Добавление Процедуры отправки подтверждения

Ниже приведен код, который показывает порядок отправки электронного письма подтверждения. Обратите внимание, что необходимо будет использовать правильные значения для адреса и номера портов своего сервера электронной почты с тем, чтобы письмо было отправлено.
Код: 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.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
procedure send_verification_email (p_username in varchar2, 
p_email in varchar2, 
p_code in raw) is 
l_body clob; 
l_link clob; 
c_smtp_server varchar2 ( 10 ): = 'localhost'; 
c_smtp_port integer: =  25 ; 
c_base_url varchar2 ( 200 ): = ➥ 
'Http://apexdemo/pls/apex/apexdemo.pkg_auth.verify_user?p_user ='; 
c_from varchar2 ( 30 ): = 'register@apex-evangelists.com'; 
begin 
l_body: ='============================================== '| | 
utl_tcp.crlf; 
l_body: = l_body | | ➥ 
'= This Is an Automated Message, Do Not Reply =' | | utl_tcp.crlf; 
l_body: = l_body | | ➥ 
'==============================================' | | utl_tcp.crlf; 
l_body: = l_body | | utl_tcp.crlf; 
l_body: = l_body | | utl_tcp.crlf; 
l_body: = l_body | | 'Hello' | | p_username | | ',' | | 
utl_tcp.crlf; 
l_body: = l_body | | utl_tcp.crlf; 
l_body: = l_body | | 'Thanks for taking the time to register' 
| | Utl_tcp.crlf; 
l_body: = l_body | | utl_tcp.crlf; 
l_body: = l_body | | ➥ 
'In order to complete your registration you will need to verify ➥ 
your email address ' | | Utl_tcp.crlf; 
l_body: = l_body | | utl_tcp.crlf; 
l_body: = l_body | | 'to verify your email address, simply ➥ 
click the link below, or copy it and paste it into the address ➥ 
field of your web browser. ' | | Utl_tcp.crlf; 
l_body: = l_body | | utl_tcp.crlf; 
l_link: = c_base_url | | p_username | | '& p_code =' | | p_code; 
l_body: = l_body | | l_link | | utl_tcp.crlf; 
l_body: = l_body | | utl_tcp.crlf; 
l_body: = l_body | | 'You only need to click this link once, ➥ 
and your account will be updated ' | | Utl_tcp.crlf; 
l_body: = l_body | | utl_tcp.crlf; 
l_body: = l_body | | 'You need to verify your email address ➥ 
within 5 days of receiving this mail. ' | | Utl_tcp.crlf; 
apex_mail.send (p_to => p_email, 
p_from => c_from, 
p_body => l_body, 
p_subj => 'Your verification email'); 
apex_mail.push_queue (c_smtp_server, 
c_smtp_port. 
end send_verification_email; 
Обратите внимание, что мы вызываем процедуру apex_mail.push_queue сразу после вызова процедуры apex_mail.send. Процедура отправления просто кладет почту в почтовый очередь APEX. Как правило, запланированное задание будет выполняться каждые 10 минут (или около того) и забирать все письма электронной почты из очереди. Вызов push_queue себя посылает сообщение немедленно, не дожидаясь запланированного задания. В действительности можно опустить имя хоста и порта в процедуре apex_mail.push_queue, поскольку она берет эти значения из настроек сервера (так что Вам не нужно знать их. Вы можете обратиться к администратору сервера электронной почты, чтобы определить наилучший вариант для вашей системы.
Вот пример сообщения, ссылающегося пользователю, если тот регистрируется.
Код: plaintext
1.
2.
3.
4.
5.
============================================== 
= This Is an Automated Message, Do Not Reply = 
============================================== 
Hello markw, 
Thanks for taking the time to register. 
In order to complete your registration you will need to verify your email address.
To verify your email address, simply click the link below, or copy it and paste it
into the address field of your web browser (note this should be a single line,
but is broken for clarity here.
http://apexdemo/pls/apex/apexdemo.pkg_auth.verify_user ➥
? P_user = markw & p_code = F6C61F52B08B5F9E5A684EFDD63D5709
You only need to click this link once, and your account will be updated.
You need to verify your email address within 5 days of receiving this mail.

Когда мы свяжем все эти части вместе, у нас будет процесс, который выполняет следующие действия:

• Позволяет пользователю представить свои данные на странице
• Создает нового пользователя в таблице user_repository со статусом «неподтвержденный» (проверить цезначення 'N')
• Сохраняет запись в таблице verification_link, содержащей имя пользователя, при регистрации аккаунта и код подтверждения

Работа с ссылкой для подтверждения

Последним шагом является написать процедуру, которая будет заниматься проверкой ссылки из сообщения электронной почты, когда его нажмет пользователь.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
procedure verify_user (p_user in varchar2, p_code in varchar2) is 
begin 
update user_repository ur 
set ur.verified = 'y' 
where upper (ur.username) = upper (p_user) 
and exists (select  1  from verification_link vl 
where 
vl.username = ur.username and 
vl.verification_code = p_code. 
if sql% rowcount>  0  then 
htp.p ('Thank you, your account has now been verified'); 
else 
htp.p ('Sorry the link you have used is invalid'); 
end if; 
end verify_user; 
Перед этой процедурой можно вызвать через URL, необходимо предоставить права на выполнение его пользователя, указанного в DAD:
Код: plaintext
1.
2.
3.
apex> grant execute on pkg_auth to htmldb_public_user; 

Grant succeeded. 
Пользователь должен теперь иметь возможность нажать на ссылку, а процедура verify_user попытается найти соответствие имени пользователя и кода, который используется при регистрации в таблицу verification_link. Если соответствие может быть найдена, соответствующий аккаунт пользователя в таблице user_repository получит значение флага подтверждения 'Y'.
Обратите внимание на использование SQL% RowCount, Вы можете отправить простое сообщение кориситувацьму браузера, чтобы пользователь узнал или подтверждение прошло успешно.
Этот простой пример должен дать вам некоторые идеи о том, как можно настроить автоматизированные системы регистрации. Вы можете легко использовать этот тип автоматизированной регистрации с некоторыми другими схемами аутентификации. Например, если у пользователя открыты cookies, можно хранить флажок подтверждения и код проверки с использованием пользовательских атрибутов, таких как p_attribute_01, p_attribute_02 и т.д. Кроме того, можно сделать много улучшений в этой автоматизированной процедуре регистрации, таких как проверка на уже занятое имя пользователя.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Oracle APEX [игнор отключен] [закрыт для гостей] / Возможность регистрации новых пользователей
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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