20 авг. 2008 г.

Apex. Саморегистрация пользователей.

Задача на первый взгляд простая. Сделать на сайте регистрацию пользователей. Делов то: нарисовал public page c нужными полями да кнопкой, которая всё это дело отправит в хранимую процедуру, которая в свою очередь создаст пользователя в базе.

Вот с последним как раз может возникнуть вопрос: как создать пользователя в apex с помощью pl/sql. Начнем с того, что в приложениях апекс могут использоваться разные схемы аутентификации. От используемой схемы как раз и зависит решение.
Например, если используется аутентификация на основе "Database Accounts", то достаточно будет создать пользователя в базе данных

execute immediate 'create user user_name identified by password';


Никаких привилегий при этом давать пользователю не нужно. После того как апекс проверит существование пользователя и соответсвие пароля для этого пользователя в базе данных, сессия будет продолжаться под пользователем APEX_PUBLIC_USER (в общем случае :)) Недостатки способа - почти никаких, за исключением того что владелец схемы , в которой находится процедура создания пользователя, должна иметь привилегию CREATE USER. Ну и обработка ошибок и контроль существующих аккаунтов основаны на внутренних механизмах Oracle.

Если используется схема аутентификации Application Express, то тогда пара пользователь-пароль будет проверяться по внутреннему репозиторию Apex. Чтобы создать в нем пользователя можно использовать API-функцию APEX_UTIL.CREATE_USER
Но тут возникнет проблема с недостаточными привилегиями, потому как выполняться процедура будет под анонимным пользователем apex (страница регистрации то у нас PUBLIC). Обойти это можно, предварительно залогинив пользователя с административными привилегиями с помощью функции APEX_CUSTOM_AUTH.LOGIN. Только после создания пользователя нужно не забыть сделать APEX_CUSTOM_AUTH.LOGOUT.
В этом варианте есть одна неприятность: из-за выполнения LOGIN забивается весь дополнительный вывод htp, который делается для обработки результатов регистрации. Во всяком случае у меня этот глюк обойти не удалось в своё время. Как при этом обрабатывать ошибки регистрации - я без понятия :)

Ну и третий вариант, создать собственную схему аутенификации, над которой можно иметь полный контроль. В этом варианте у вас будет своя таблица с пользователями и паролями (можно зашифрованными), в которую при регистрации новых пользователей можно просто вставлять записи. Этот вариант самый предпочтительный. А как создать свою схему аутентификации напишу позже, там ничего сложного :)

Остальные схемы (SSO, LDAP, DAD..) я не рассматриваю, потому что ни разу не встречал и ничего толком о них пока не знаю.

Комментариев нет: