CodeIgniter: Аутентификация на сайте с помощью библиотеки DX Auth
Добро пожаловать в DX Auth
DX Auth - это библиотека для авторизации и регистрации пользователей на сайте, построенном на фреймворке CodeIgniter. Это решение, которое позволит вам добавить безопасную и простую систему авторизации посетителей на вашем веб-проекте, вы сможете гибко выбирать простую ли вы сделаете авторизацию или даже навороченную.
DX Auth разрабатывалась с идеей интернационализации, проще говоря, в языковом файле вы можете всё сделать под свой родной язык.
Библиотека основана на CL Auth 0.2.5 beta, разработанной Jason Ashdown.
Какие возможности даёт мне DX Auth?
- Основные процедуры (Вход, выход, регистрация, смена пароля).
- Опция Remember me (Запомнить меня).
- Вход по username или по email address или и то и то (зависит от настроек в config).
- Восстановление пароля (Forgot password).
- Наказать провинившегося пользоателя (Ban user).
- Опция Последний заход - IP address и время (optional).
- Активация по Email (optional).
- Профиль пользователя (User Profile) (optional).
- Роли (admin, user, moderator, etc). Поддерживается наследование (optional).
- Вид страницы согласно URI и роли (optional).
- Особенный права для каждой роли (optional).
- Попытка входа-логина (optional). Вы можете использовать капчу, после попытки залогиниться, чтобы защититься от ботов.
- События (Например: Вы можете задать приветственной сообщение, когда пользователь активировал свой профиль).
- Captcha (optional, родная и reCAPTCHA доступны).
- Простая панель управления (Поэтому вы можете её настраивать, включать в свою админ-панель или удалить, если не нужна).
- Большинство настроек необязательны - можете пользоваться, можете удалить.
Установка.
Установка в предустановленными примерами
- Разархивируйте package.
- Скопируйте папку captcha в ваш каталог CI. Сделайте права на запись в него.
- Скопируйте папку application в папку application.
- Залейте настройки database schema в вашу базу данных.
Ниже представлены эти запросы, они же в 'schema.sql'.
Этими запросами вы установите:
- CI Session table named 'ci_sessions'. Можете удалить этот запрос, если уже есть такая таблица в вашей БД.
- DX Auth library table.
- Пользователя с правами admin, его зовут: admin, пароль: hello.
- Пользователя с правами user, имя: user, пароль: hello.
- Роли по умолчанию в таблицу role_table (User and admin).
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"; /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; /*!40101 SET NAMES utf8 */; -- -------------------------------------------------------- -- -- Table structure for table `ci_sessions` -- CREATE TABLE IF NOT EXISTS `ci_sessions` ( `session_id` varchar(40) collate utf8_bin NOT NULL default '0', `ip_address` varchar(16) collate utf8_bin NOT NULL default '0', `user_agent` varchar(150) collate utf8_bin NOT NULL, `last_activity` int(10) unsigned NOT NULL default '0', `user_data` text collate utf8_bin NOT NULL, PRIMARY KEY (`session_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; -- -------------------------------------------------------- -- -- Table structure for table `login_attempts` -- CREATE TABLE IF NOT EXISTS `login_attempts` ( `id` int(11) NOT NULL auto_increment, `ip_address` varchar(40) collate utf8_bin NOT NULL, `time` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=1 ; -- -------------------------------------------------------- -- -- Table structure for table `roles` -- CREATE TABLE IF NOT EXISTS `roles` ( `id` int(11) NOT NULL auto_increment, `parent_id` int(11) NOT NULL default '0', `name` varchar(30) collate utf8_bin NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=3 ; -- -- Dumping data for table `roles` -- INSERT INTO `roles` (`id`, `parent_id`, `name`) VALUES (1, 0, 'User'), (2, 0, 'Admin'); -- -------------------------------------------------------- -- -- Table structure for table `permissions` -- CREATE TABLE IF NOT EXISTS `permissions` ( `id` int(11) NOT NULL auto_increment, `role_id` int(11) NOT NULL, `data` text collate utf8_bin, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=1 ; -- -------------------------------------------------------- -- -- Table structure for table `users` -- CREATE TABLE IF NOT EXISTS `users` ( `id` int(11) NOT NULL auto_increment, `role_id` int(11) NOT NULL default '1', `username` varchar(25) collate utf8_bin NOT NULL, `password` varchar(34) collate utf8_bin NOT NULL, `email` varchar(100) collate utf8_bin NOT NULL, `banned` tinyint(1) NOT NULL default '0', `ban_reason` varchar(255) collate utf8_bin default NULL, `newpass` varchar(34) collate utf8_bin default NULL, `newpass_key` varchar(32) collate utf8_bin default NULL, `newpass_time` datetime default NULL, `last_ip` varchar(40) collate utf8_bin NOT NULL, `last_login` datetime NOT NULL default '0000-00-00 00:00:00', `created` datetime NOT NULL default '0000-00-00 00:00:00', `modified` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=3 ; -- -- Dumping data for table `users` -- INSERT INTO `users` (`id`, `role_id`, `username`, `password`, `email`, `banned`, `ban_reason`, `newpass`, `newpass_key`, `newpass_time`, `last_ip`, `last_login`, `created`, `modified`) VALUES (1, 2, 'admin', '$1$i75.Do4.$ROPRZjZzDx/JjqeVtaJLW.', 'admin@localhost.com', 0, NULL, NULL, NULL, NULL, '127.0.0.1', '2008-11-30 04:56:38', '2008-11-30 04:56:32', '2008-11-30 04:56:38'), (2, 1, 'user', '$1$bO..IR4.$CxjJBjKJ5QW2/BaYKDS7f.', 'user@localhost.com', 0, NULL, NULL, NULL, NULL, '127.0.0.1', '2008-12-01 14:04:14', '2008-12-01 14:01:53', '2008-12-01 14:04:14'); -- -------------------------------------------------------- -- -- Table structure for table `user_autologin` -- CREATE TABLE IF NOT EXISTS `user_autologin` ( `key_id` char(32) collate utf8_bin NOT NULL, `user_id` mediumint(8) NOT NULL default '0', `user_agent` varchar(150) collate utf8_bin NOT NULL, `last_ip` varchar(40) collate utf8_bin NOT NULL, `last_login` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, PRIMARY KEY (`key_id`,`user_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; -- -------------------------------------------------------- -- -- Table structure for table `user_profile` -- CREATE TABLE IF NOT EXISTS `user_profile` ( `id` int(11) NOT NULL auto_increment, `user_id` int(11) NOT NULL, `country` varchar(20) collate utf8_bin default NULL, `website` varchar(255) collate utf8_bin default NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=2 ; -- -- Dumping data for table `user_profile` -- INSERT INTO `user_profile` (`id`, `user_id`, `country`, `website`) VALUES (1, 1, NULL, NULL); -- -------------------------------------------------------- -- -- Table structure for table `user_temp` -- CREATE TABLE IF NOT EXISTS `user_temp` ( `id` int(11) NOT NULL auto_increment, `username` varchar(255) collate utf8_bin NOT NULL, `password` varchar(34) collate utf8_bin NOT NULL, `email` varchar(100) collate utf8_bin NOT NULL, `activation_key` varchar(50) collate utf8_bin NOT NULL, `last_ip` varchar(40) collate utf8_bin NOT NULL, `created` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=1 ;
5. Откройте application/config/config.php. Измените $config['sess_use_database'] на TRUE.
Установка только библиотеки DX Auth
- Разархивируйте package.
- Copy captcha в ваш CI каталог. ЗАдайте права на запись.
- Copy application/plugins/ folder into your CI application/plugins/ folder.
- Copy application/config/ folder into your CI application/config/ folder.
- Copy application/libraries/ folder into your CI application/libraries/ folder.
- Copy application/helpers/ folder into your CI application/helpers/ folder.
- Copy application/models/ folder into your CI application/models/ folder.
- Copy application/language/ folder into your CI application/language/ folder.
- Залейте настройки database schema в вашу базу данных.
- Откройте application/config/config.php. Измените $config['sess_use_database'] на TRUE.
Начало работы.
После установки посмотрите файл настроек:
/* | ------------------------------------------------------------------- | DX Auth Config | ------------------------------------------------------------------- */ /* |-------------------------------------------------------------------------- | Website details |-------------------------------------------------------------------------- | | These details are used in email sent by DX Auth library. | */ $config['DX_website_name'] = 'Your Website'; $config['DX_webmaster_email'] = 'webmaster@yourhost.com'; /* |-------------------------------------------------------------------------- | Database table |-------------------------------------------------------------------------- | | Determines table that used by DX Auth. | | 'DX_table_prefix' allows you to specify table prefix that will be use by the rest of the table. | | For example specifying 'DX_' in 'DX_table_prefix' and 'users' in 'DX_users_table', | will make DX Auth user 'DX_users' as users table. | */ $config['DX_table_prefix'] = ''; $config['DX_users_table'] = 'users'; $config['DX_user_profile_table'] = 'user_profile'; $config['DX_user_temp_table'] = 'user_temp'; $config['DX_user_autologin'] = 'user_autologin'; $config['DX_roles_table'] = 'roles'; $config['DX_permissions_table'] = 'permissions'; $config['DX_login_attempts_table'] = 'login_attempts'; /* |-------------------------------------------------------------------------- | Password salt |-------------------------------------------------------------------------- | | You can add major salt to be hashed with password. | For example, you can get salt from here: https://www.grc.com/passwords.htm | | Note: | | Keep in mind that if you change the salt value after user registered, | user that previously registered cannot login anymore. | */ $config['DX_salt'] = ''; /* |-------------------------------------------------------------------------- | Registration related settings |-------------------------------------------------------------------------- | | 'DX_email_activation' = Requires user to activate their account using email after registration. | 'DX_email_activation_expire' = Time before users who don't activate their account getting deleted from database. Default is 48 Hours (60*60*24*2). | 'DX_email_account_details' = Email account details after registration, only if 'DX_email_activation' is FALSE. | */ $config['DX_email_activation'] = TRUE; $config['DX_email_activation_expire'] = 60*60*24*2; $config['DX_email_account_details'] = TRUE; /* |-------------------------------------------------------------------------- | Login settings |-------------------------------------------------------------------------- | | 'DX_login_using_username' = Determine if user can use username in username field to login. | 'DX_login_using_email' = Determine if user can use email in username field to login. | | You have to set at least one of settings above to TRUE. | | 'DX_login_record_ip' = Determine if user IP address should be recorded in database when user login. | 'DX_login_record_time' = Determine if time should be recorded in database when user login. | */ $config['DX_login_using_username'] = TRUE; $config['DX_login_using_email'] = TRUE; $config['DX_login_record_ip'] = TRUE; $config['DX_login_record_time'] = TRUE; /* |-------------------------------------------------------------------------- | Auto login settings |-------------------------------------------------------------------------- | | 'DX_autologin_cookie_name' = Determine auto login cookie name. | 'DX_autologin_cookie_life' = Determine auto login cookie life before expired. Default is 2 months (60*60*24*31*2). | */ $config['DX_autologin_cookie_name'] = 'autologin'; $config['DX_autologin_cookie_life'] = 60*60*24*31*2; /* |-------------------------------------------------------------------------- | Login attempts |-------------------------------------------------------------------------- | | 'DX_count_login_attempts' = Determine if DX Auth should count login attempt when user failed to login. | 'DX_max_login_attempts' = Determine max login attempt before function is_login_attempt_exceeded() returning TRUE. | */ $config['DX_count_login_attempts'] = TRUE; $config['DX_max_login_attempts'] = 1; /* |-------------------------------------------------------------------------- | Forgot password settings |-------------------------------------------------------------------------- | | 'DX_forgot_password_expire' = Time before forgot password key become invalid. Default is 15 minutes (900 seconds). | */ $config['DX_forgot_password_expire'] = 900; /* |-------------------------------------------------------------------------- | Captcha |-------------------------------------------------------------------------- | | You can set catpcha that created by DX Auth library in here. | 'DX_captcha_directory' = Name of directory where the catpcha will be created. | 'DX_captcha_fonts_path' = Font in this directory will be used when creating captcha. | 'DX_captcha_font_size' = Font size when writing text to captcha. Leave blank for random font size. | 'DX_captcha_grid' = Show grid in created captcha. | 'DX_captcha_expire' = Life time of created captcha before expired, default is 3 minutes (180 seconds). | 'DX_captcha_expire' = Determine captcha case sensitive or not. | */ $config['DX_captcha_directory'] = 'captcha'; $config['DX_captcha_fonts_path'] = $config['DX_captcha_path'].'fonts'; $config['DX_captcha_width'] = 320; $config['DX_captcha_height'] = 95; $config['DX_captcha_font_size'] = ''; $config['DX_captcha_grid'] = TRUE; $config['DX_captcha_expire'] = 180; $config['DX_captcha_case_sensitive'] = TRUE; /* |-------------------------------------------------------------------------- | reCAPTCHA |-------------------------------------------------------------------------- | | If you are planning to use reCAPTCHA function, you have to set reCAPTCHA key here | You can get the key by registering at http://recaptcha.net | */ $config['DX_recaptcha_public_key'] = ''; $config['DX_recaptcha_private_key'] = ''; /* |-------------------------------------------------------------------------- | URI |-------------------------------------------------------------------------- | | Determines URI that used for redirecting in DX Auth library. | 'DX_deny_uri' = Forbidden access URI. | 'DX_login_uri' = Login form URI. | 'DX_activate_uri' = Activate user URI. | 'DX_reset_password_uri' = Reset user password URI. | | These value can be accessed from DX Auth library variable, by removing 'DX_' string. | For example you can access 'DX_deny_uri' by using $this->dx_auth->deny_uri in controller. | */ $config['DX_deny_uri'] = '/auth/deny/'; $config['DX_login_uri'] = '/auth/login/'; $config['DX_banned_uri'] = '/auth/banned/'; $config['DX_activate_uri'] = '/auth/activate/'; $config['DX_reset_password_uri'] = '/auth/reset_password/'; /* |-------------------------------------------------------------------------- | Helper configuration |-------------------------------------------------------------------------- | | Configuration below is actually not used in function in DX_Auth library. | They just used to help you coding more easily in controller. | You can set it to blank if you don't need it, or even delete it. | | However they can be accessed from DX Auth library variable, by removing 'DX_' string. | For example you can access 'DX_register_uri' by using $this->dx_auth->register_uri in controller. | */ // Registration $config['DX_allow_registration'] = TRUE; $config['DX_captcha_registration'] = TRUE; // Login $config['DX_captcha_login'] = FALSE; // URI Locations $config['DX_logout_uri'] = '/auth/logout/'; $config['DX_register_uri'] = '/auth/register/'; $config['DX_forgot_password_uri'] = '/auth/forgot_password/'; $config['DX_change_password_uri'] = '/auth/change_password/'; $config['DX_cancel_account_uri'] = '/auth/cancel_account/'; // Forms view $config['DX_login_view'] = 'auth/login_form'; $config['DX_register_view'] = 'auth/register_form'; $config['DX_forgot_password_view'] = 'auth/forgot_password_form'; $config['DX_change_password_view'] = 'auth/change_password_form'; $config['DX_cancel_account_view'] = 'auth/cancel_account_form'; // Pages view $config['DX_deny_view'] = 'auth/general_message'; $config['DX_banned_view'] = 'auth/general_message'; $config['DX_logged_in_view'] = 'auth/general_message'; $config['DX_logout_view'] = 'auth/general_message'; $config['DX_register_success_view'] = 'auth/general_message'; $config['DX_activate_success_view'] = 'auth/general_message'; $config['DX_forgot_password_success_view'] = 'auth/general_message'; $config['DX_reset_password_success_view'] = 'auth/general_message'; $config['DX_change_password_success_view'] = 'auth/general_message'; $config['DX_register_disabled_view'] = 'auth/general_message'; $config['DX_activate_failed_view'] = 'auth/general_message'; $config['DX_reset_password_failed_view'] = 'auth/general_message';
Если хотите уже посмотреть в действии вашу систему, то:
To do that you can open:
- {your CI url}/auth/login/ to login.
- {your CI url}/auth/logout/ to logout.
- {your CI url}/auth/register/ to register.
- {your CI url}/auth/register_recaptcha/ to register using reCAPTCHA.
- {your CI url}/auth/forgot_password/ to use forgot password feature.
- {your CI url}/auth/change_password/ to change password after you logged in.
- {your CI url}/auth/cancel_account/ to delete account after you logged in.
To access admin control panel (You need to logged in as admin or your user role is granted in permissions table.):
- {your CI url}/backend/users/ to manage users.
- {your CI url}/backend/unactivated_users/ to manage unactivated users.
- {your CI url}/backend/roles/ to manage roles.
- {your CI url}/backend/uri_permissions/ to manage URI permissions.
- {your CI url}/backend/custom_permissions/ to manage custom permissions.
{your CI url} это комбинация 'base_url' и 'index_page' из вашего файла config.
Простой пример использования.
создайте класс Auth d контроллере Auth:
class Auth extends Controller { function Auth() { parent::Controller(); // Load library $this->load->library('DX_Auth'); } function login() { // Login using username 'test' and password 'helloworld' $this->dx_auth->login('test', 'helloworld'); } function logout() { // Logout user $this->dx_auth->logout(); } function register() { // Register a user with username 'john', password 'johnpassword', and email 'john@yourmail.com' if ($user = $this->dx_auth->register('john', 'johnpassword', 'john@yourmail.com')) { echo 'Welcome '.$user->username; } else { echo 'Failed to register'; } } function hello() { // Check if user is logged in or not if ($this->dx_auth->is_logged_in()) { echo 'Hello world'; } else { echo 'Not logged in'; } } }
Более сложный пример смотрите в controllers/auth.php, он включен в скачивавемый архив.
Скачать библиотеку: dx_auth.zip
almix
Разработчик Loco, автор статей по веб-разработке на Yii, CodeIgniter, MODx и прочих инструментах. Создатель Team Sense.
Вы можете почитать все статьи от almix'а.
- 0 CodeIgniter: Всплывающая форма обратной связи на Ajax в Bootstrap Modal и проверкой Captcha (18.02.2014)
- Как правильно обновить ExpressionEngine до последней версии 2.5.5 (05.02.2013)
- Team Sense: Доступна отправка сообщения/письма на email сотрудника. (18.01.2013)
- TeamSense: username (логин) в регистрации пользователя. Внедрили библиотеку DHTMLX в TeamSense. (11.01.2013)
- Team Sense: В календарь добавлена возможность указывать место проведения уроков (в офисе, на выезде) (12.12.2012)
- Team Sense: Многопользовательский календарь, заменяем радиокнопки на чекбоксы в выборе преподавателей. Массивы в Javascript. (06.12.2012)
- Team Sense: В календарь-расписание уроков добавлено разделение по преподавателям, которым присвоены свои цвета. (04.12.2012)
- CodeIgniter не передаёт $this->uri->segment(3) в функцию контроллера (передача переменной PHP->JavaScript->PHP) (28.11.2012)
- Воюем с форматом даты в JavaScript. Приведение формата даты в поле input в календаре системы TeamSense к более красивому виду. (18.11.2012)
- Team Sense: Теперь Email-оповещения в TODO можно отправлять как для руководителя задачи, так и для помощников. (21.09.2012)
- CodeIgniter и TeamSense: Делаем свой вид для страницы с ошибкой 404, настраиваем правильную отдачу статусов в HTTP headers (12.09.2012)
- Установка другого сайта (на CodeIgniter или Yii) в подпапку и чтобы поддомен ссылался на подпапку (25.08.2015)
- CodeIgniter: Подключение JS и CSS файлов там, где это нужно. (26.06.2012)
- Использование DISTINCT в SQL-запросах для исключения повторяющихся данных применительно к фреймворку CodeIgniter. (18.06.2012)
- CodeIgniter выдаёт ошибку: Cannot modify header information - headers already sent by (13.04.2012)
- CodeIgniter: Передаются пустые значения полей формы через $_POST если вводить русские символы. Форма не проходит валидацию. (17.08.2016)
- Обновление CodeIgniter с версии 2.0 (2.0.0) до версии 2.0.1 (23.01.2012)
- CodeIgniter: Показываем сообщения пользователю на его действия (19.11.2011)
- Настройка локальной и рабочей сред для разработки на CodeIgniter (2-й вариант) (22.01.2012)
- Календарь c несколькими событиями в один день на CodeIgniter (Calendar Multiple Events Per Day) (23.10.2011)
- Настройка локальной среды для разработки на CodeIgniter в Mac OSX, используя MAMP (22.01.2012)
- Обновление CodeIgniter с версии 2.0.1 до 2.0.2 (23.10.2011)
- CodeIgniter: Аутентификация на сайте с помощью библиотеки DX Auth (24.08.2011) ← вы тут
- Сравнение Yii с CodeIgniter (23.10.2011)
- CodeIgniter: Рассылка email по выбранным группам зарегистрированных пользователей и списку незарегистрированных пользователей (02.03.2013)
6 комментариев
Сделал все как описано, но при:
{your CI url}/auth/login/ to login
ошибка:
Fatal error: Class 'Controller' not found in W:\home\test1.ru\ci\application\controllers\auth.php on line 2
то же самое при {your CI url}/auth/register/ to register
С пред. вопросом разобрался сам погуглив.
Теперь другой вопрос:
CI я установил на Denwere по пути w:\home\test1.ru\ci\
страница авторизации отлично открывается по адресу http://ci.test1.ru/auth/login
но после нажатия кнопки Login, перенаправляет на адрес http://ci.test1.ru/auth/ci.test1.ru/auth/login
и конечно же
404 Page Not Found
Спасибо, за пред. ответ, все получилось, (нужно было внимательно читать инструкции по настройке CI :)), теперь выходит ошибка
Unable to load the requested file: helpers/dx_captcha_helper.php
в скачанном архиве по указанному пути есть только recaptcha_helper.php, которая требует паблик кей, а в инете не нашел этот файл