CodeIgniter: Аутентификация на сайте с помощью библиотеки DX Auth

Нет картинки Добро пожаловать в 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 доступны).
  • Простая панель управления (Поэтому вы можете её настраивать, включать в свою админ-панель или удалить, если не нужна).
  • Большинство настроек необязательны - можете пользоваться, можете удалить.

 

Установка.

Установка в предустановленными примерами

  1. Разархивируйте package.
  2. Скопируйте папку captcha в ваш каталог CI. Сделайте права на запись в него.
  3. Скопируйте папку application в папку application.
  4. Залейте настройки 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

  1. Разархивируйте package.
  2. Copy captcha в ваш CI каталог. ЗАдайте права на запись.
  3. Copy application/plugins/ folder into your CI application/plugins/ folder.
  4. Copy application/config/ folder into your CI application/config/ folder.
  5. Copy application/libraries/ folder into your CI application/libraries/ folder.
  6. Copy application/helpers/ folder into your CI application/helpers/ folder.
  7. Copy application/models/ folder into your CI application/models/ folder.
  8. Copy application/language/ folder into your CI application/language/ folder.
  9. Залейте настройки database schema в вашу базу данных.
  10. Откройте 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'а.



Другие статьи по этой теме:

Комментарии (6)     Подпишитесь на RSS комментариев к этой статье.

6 комментариев

#826
Spot говорит:
April 4, 2013 at 05:08 am

Сделал все как описано, но при:

{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

#827
Spot говорит:
April 4, 2013 at 05:46 am

С пред. вопросом разобрался сам погуглив.

Теперь другой вопрос:

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

в конфиге у меня: $config['base_url'] = 'ci.test1.ru';

#830
almix говорит:
April 6, 2013 at 12:37 pm
Spot, поставьте $config['base_url'] = 'http://ci.test1.ru/'; (слеш на конце), либо в контроллере auth у метода login ставьте слеши впереди редиректа (но тогда в нескольких местах это нужно добавить будет).
#838
Spot говорит:
April 8, 2013 at 04:27 am

Спасибо, за пред. ответ, все получилось, (нужно было внимательно читать инструкции по настройке CI :)), теперь выходит ошибка

Unable to load the requested file: helpers/dx_captcha_helper.php

в скачанном архиве по указанному пути есть только recaptcha_helper.php, которая требует паблик кей, а в инете не нашел этот файл

#904
Олег говорит:
July 2, 2013 at 12:30 am
И ещё, не забудь про "www". Вот так: $config['base_url'] = 'http://www.ci.test1.ru/';
#929
Дмитрий говорит:
August 2, 2013 at 03:19 pm
Почему-то, каптча не работает( при вводе любой комбинации пропускает...( Был не прав