Подготовка
Устанавливаем 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, авторизация, регистрация и восстановление пароля через БД.
devreadwrite.com



Подборка адаптивных шаблонов для вашей CMS
Статьи по
Как получить и установить HTTPS сертификат на сайта

Комментарии
Комментарии отсутствуют, Вы можете быть первым