Подготовка
Устанавливаем Yii, в настройка (/protected/config.php) проекта включаем gii:
<?php return array( //... 'modules'=>array( 'gii'=>array( 'class'=>'system.gii.GiiModule', 'password'=>'123', 'ipFilters'=>array('127.0.0.1','::1'), ), ), //... );
Заодно раскомментируем urlManager и добавим соединение с БД:
<?php return array( //... 'components'=>array( //... 'urlManager'=>array( 'urlFormat'=>'path', 'showScriptName' => false, 'rules'=>array( '<controller:\w+>/<id:\d+>'=>'<controller>/view', '<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>', '<controller:\w+>/<action:\w+>'=>'<controller>/<action>', ), ), 'db' => array( 'connectionString' => 'mysql:host=localhost;dbname=yii_auth', 'emulatePrepare' => true, 'username' => 'root', 'password' => '', 'charset' => 'utf8', ), //... ), //... );
Соединение с БД можно добавить в файл database.php, но я по старой привычки с более ранних версий yii добавляю в main.php.
Далее настроим соединение с БД для консольных команд, для этого открываем файд /protected/config/console.php и добавляем соединение с БД:
<?php return array( //... 'components'=>array( //... 'db' => array( 'connectionString' => 'mysql:host=localhost;dbname=yii_auth', 'emulatePrepare' => true, 'username' => 'root', 'password' => '', 'charset' => 'utf8', ), //... ), //... );
В корень проекта добавляем файл .htaccess со следующим содержимым:
AddDefaultCharset utf-8 RewriteEngine on RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . index.php
Yii 1, добавляем авторизацию через БД
Перейдем к добавлении авторизации через БД. Для начала необходимо добавить таблицу пользователей (user) в БД.
Таблица user будет содержать следующие поля:
id | integer | Id пользователя |
string | Email пользователя, будем использовать для авотризации в качестве логина | |
password | string | Пароль пользователя, будем хранить как хеш md5 |
name | string | Имя пользователя |
date | integer | Дата регистрации |
status | integer | Статус, можем использовать для бана пользователей или чего-то подобного |
role | string | Роль пользователя, для использования RBAC в дальнейшем |
И так со структурой таблицы определились, добавляем ее в миграции (подробнее о миграциях можно прочитать здесь: Yii Framework. Миграции). Открываем консоль переходим в папку с проектом:
cd domains/mysite.local/protected
И выполняем команду создания миграции:
yiic migrate create create_user_table
Файл миграции создан, открываем его для редактирования (/protected/migration/m000000_000000_create_user_table.php) и добавляем код создания таблицы:
<?php class m161218_121537_create_user_table extends CDbMigration { public function up() { $sql = "CREATE TABLE IF NOT EXISTS `user` ( `id` int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, `email` varchar(255) NOT NULL, `password` varchar(255) NOT NULL, `name` varchar(255) NOT NULL, `date` int(11) NOT NULL, `status` int(11) NOT NULL, `role` varchar(255) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;"; Yii::app()->db->createCommand($sql)->execute(); } public function down() { $sql = "DROP TABLE user"; Yii::app()->db->createCommand($sql)->execute(); } }
После добавления кода создания таблицы user, применяем миграцию в консоле с помощью команды:
yiic migrate
Теперь создадим модель для таблицы user, открываем gii, переходим к разделу Model Generator заполняем форму и жмем "Preview" и "Generate" (в браузере, mysite.local/gii/model/index):
Gii создаст следующий класс (/preotected/models/User.php):
<?php /** * This is the model class for table "user". * * The followings are the available columns in table 'user': * @property integer $id * @property string $email * @property string $password * @property string $name * @property integer $date * @property integer $status * @property string $role */ class User extends CActiveRecord { /** * @return string the associated database table name */ public function tableName() { return 'user'; } /** * @return array validation rules for model attributes. */ public function rules() { // NOTE: you should only define rules for those attributes that // will receive user inputs. return array( array('email, password, name, date, status, role', 'required'), array('date, status', 'numerical', 'integerOnly'=>true), array('email, password, name, role', 'length', 'max'=>255), // The following rule is used by search(). // @todo Please remove those attributes that should not be searched. array('id, email, password, name, date, status, role', 'safe', 'on'=>'search'), ); } /** * @return array relational rules. */ public function relations() { // NOTE: you may need to adjust the relation name and the related // class name for the relations automatically generated below. return array( ); } /** * @return array customized attribute labels (name=>label) */ public function attributeLabels() { return array( 'id' => 'ID', 'email' => 'Email', 'password' => 'Password', 'name' => 'Name', 'date' => 'Date', 'status' => 'Status', 'role' => 'Role', ); } /** * Retrieves a list of models based on the current search/filter conditions. * * Typical usecase: * - Initialize the model fields with values from filter form. * - Execute this method to get CActiveDataProvider instance which will filter * models according to data in model fields. * - Pass data provider to CGridView, CListView or any similar widget. * * @return CActiveDataProvider the data provider that can return the models * based on the search/filter conditions. */ public function search() { // @todo Please modify the following code to remove attributes that should not be searched. $criteria=new CDbCriteria; $criteria->compare('id',$this->id); $criteria->compare('email',$this->email,true); $criteria->compare('password',$this->password,true); $criteria->compare('name',$this->name,true); $criteria->compare('date',$this->date); $criteria->compare('status',$this->status); $criteria->compare('role',$this->role,true); return new CActiveDataProvider($this, array( 'criteria'=>$criteria, )); } /** * Returns the static model of the specified AR class. * Please note that you should have this exact method in all your CActiveRecord descendants! * @param string $className active record class name. * @return User the static model class */ public static function model($className=__CLASS__) { return parent::model($className); } }
В класс User добавим 2 константы. Это будут значения по умолчанию для полей status и role при добавлении (регистрации) новых пользователей. А так же поправим метод rules(), который отвечает за валидацию полей. В него мы добавим правила о том, что поле email должно быть уникальным, так как его мы будем использовать в качестве логина, и правило о том, что это поле должно быть именно email'ом. Так же добавим минимальную длину пароля в 5 символов:
<?php class User extends CActiveRecord { const DEFAULT_STATUS = 0; const DEFAULT_ROLE = 'user'; //... public function rules() { return array( array('email, password, name, date, status, role', 'required'), array('email', 'email'), array('email', 'unique'), array('password', 'length', 'min' => '5'), array('date, status', 'numerical', 'integerOnly'=>true), array('email, password, name, role', 'length', 'max'=>255), array('id, email, password, name, date, status, role', 'safe', 'on'=>'search'), ); } //... }
Далее открываем класс /protected/components/UserIdentity.php, который отвечает за авторизацию пользователя и правим метод authenticate() следующим образом:
<?php class UserIdentity extends CUserIdentity { public function authenticate() { $record = User::model()->findByAttributes(array('email' => $this->username)); if ($record === null) { $this->errorCode = self::ERROR_USERNAME_INVALID; } else if ($record->password !== md5($this->password)) { $this->errorCode = self::ERROR_PASSWORD_INVALID; } else { $this->setState('title', $record->name); $this->setState('role', $record->role); $this->setState('uid', $record->id); $this->errorCode=self::ERROR_NONE; } return !$this->errorCode; } }
Для того что бы уменьшить переделывание кода, вместо email, при авторизации будем использовать username, но при желании это можно исправить в следующих файлах: /protected/components/UserIdentity.php, /models/LoginForm.php и /protected/views/site/login.php. Все остальное оставляем (view авторизации (login) и actionLogin) как было по умолчанию.
Авторизация готова, можем протестировать авторизацию через БД в Yii 1, для этого добавляем нового пользователя в таблицу user через phpMyAdmin (незабудте указать функцию md5 для пароля при добавлении пользователя) и открываем страницу авторизации (mysite.local/site/login).
Теперь когда авторизация работает, можем перейти к регистрации. Список статей по теме: Yii Framework, авторизация, регистрация и восстановление пароля через БД.
Комментарии
Комментарии отсутствуют, Вы можете быть первым