Авторизация yii 2 из базы
попробуем разобраться как работает авторизация в yii 2.
если начинаете с нуля то
перед миграцией нужно настроить подключение к базе.
в \localhost\yii2rbac\common\config\main-local.php поменяем
создадим под коннект файл db.php
ну и зададим свои настройки
я использую Postgres - здесь еще нужно схему указать
пошутил. конечно это не будет работать ))))
в \yii2rbac\common\models\User.php
напрямую правим
тут пошли танцы с бубном. первоначальный вид таблицы мне конечно не понравился
решил привести таблицу юзера к такому виду
---
sql
на мой вкус username нужно бы поменять на login, а password_hash на password
но боялся грохнуть то что есть.
пойдем по файлам
\localhost\yii2rbac\common\models\User.php
комментим
\yii2rbac\frontend\models\SignupForm.php
сносим все что относится к емэйлу
в \yii2rbac\frontend\views\site\signup.php
удаляем поле мыла
получаем примерно
создадим модель в gii
и круд
получим
можете перейти по http://localhost/yii2rbac/backend/web/index.php/user
и увидите своего пользователя и захэшированный пароль
ну а теперь создание и редактирование пользователей.
поправим форму ввода \yii2rbac\backend\views\user\_form.php
добавим в модель пару методов \yii2rbac\backend\models\MyUser.php
в модели еще поправим
а в yii2rbac\common\config\params.php добавим
и поправим контроллер \yii2rbac\backend\controllers\UserController.php
ну вот наверно и все. можем убрать из меню signup и пользователь сможет заходить только по паролю из базы
ну и в результате
ну и следующая тема про rbac
если начинаете с нуля то
composer global require "fxp/composer-asset-plugin:~1.0.0"
composer create-project --prefer-dist yiisoft/yii2-app-advanced yii2rbac
cd yii2rbac
php init --env=Development
php yii migrate
перед миграцией нужно настроить подключение к базе.
в \localhost\yii2rbac\common\config\main-local.php поменяем
'components' => [
'db' => require(__DIR__ . '/db.php'),
создадим под коннект файл db.php
ну и зададим свои настройки
'yii\db\Connection',
//'dsn' => 'mysql:host=localhost;dbname=localdb',
'dsn' => 'pgsql:host=***.ru;port=5432;dbname=DB_**',
'username' => 'postgres',
'password' => '****',
'schemaMap' => [
'pgsql' => [
'class' => 'yii\db\pgsql\Schema',
'defaultSchema' => 'yii2' //specify your schema here
]
],
'charset' => 'utf8',
];
я использую Postgres - здесь еще нужно схему указать
пошутил. конечно это не будет работать ))))
в \yii2rbac\common\models\User.php
напрямую правим
public static function tableName()
{
return 'yii2.{{%user}}';
}
тут пошли танцы с бубном. первоначальный вид таблицы мне конечно не понравился
решил привести таблицу юзера к такому виду
---
sql
CREATE TABLE yii2."user" (
id INTEGER DEFAULT nextval('yii2.t_user_id_seq'::regclass) NOT NULL,
username VARCHAR(45) NOT NULL,
password_hash VARCHAR(255),
id_role INTEGER,
comment TEXT,
created_at TIMESTAMP WITHOUT TIME ZONE DEFAULT now()::timestamp without time zone NOT NULL,
ban_date TIMESTAMP WITHOUT TIME ZONE,
status INTEGER DEFAULT 10,
auth_key TEXT,
CONSTRAINT t_user_pkey PRIMARY KEY(id),
CONSTRAINT user_username_key UNIQUE(username),
CONSTRAINT role_fk FOREIGN KEY (id_role)
REFERENCES yii2.role(id)
ON DELETE NO ACTION
ON UPDATE NO ACTION
NOT DEFERRABLE
)
WITH (oids = false);
COMMENT ON COLUMN yii2."user".id
IS 'ид';
COMMENT ON COLUMN yii2."user".username
IS 'имя';
COMMENT ON COLUMN yii2."user".password_hash
IS 'пароль';
COMMENT ON COLUMN yii2."user".id_role
IS 'роль';
COMMENT ON COLUMN yii2."user".comment
IS 'комментарий';
COMMENT ON COLUMN yii2."user".created_at
IS 'создан';
COMMENT ON COLUMN yii2."user".ban_date
IS 'заблокирован';
COMMENT ON COLUMN yii2."user".status
IS 'заблокировать';
---на мой вкус username нужно бы поменять на login, а password_hash на password
но боялся грохнуть то что есть.
пойдем по файлам
\localhost\yii2rbac\common\models\User.php
комментим
//use yii\behaviors\TimestampBehavior;
- нужно для временных (int это время? кхе-кхе) полей public function behaviors()
{
return [
// TimestampBehavior::className(),
];
}
тоже в топку\yii2rbac\frontend\models\SignupForm.php
сносим все что относится к емэйлу
'trim'],
['username', 'required'],
['username', 'unique', 'targetClass' => '\common\models\User', 'message' => 'This username has already been taken.'],
['username', 'string', 'min' => 2, 'max' => 255],
// [ 'filter', 'filter' => 'trim'],
// ['email', 'required'],
// ['email', 'email'],
// [ 'unique', 'targetClass' => '\common\models\User', 'message' => 'This email address has already been taken.'],
['password', 'required'],
['password', 'string', 'min' => 6],
];
}
/**
* Signs user up.
*
* @return User|null the saved model or null if saving fails
*/
public function signup()
{
if ($this->validate())
{
$user = new User();
$user->username = $this->username;
// $user->email = $this->email;
$user->setPassword($this->password);
$user->generateAuthKey();
if ($user->save())
{
return $user;
}
}
return null;
}
}
в \yii2rbac\frontend\views\site\signup.php
удаляем поле мыла
получаем примерно
создадим модель в gii
и круд
получим
можете перейти по http://localhost/yii2rbac/backend/web/index.php/user
и увидите своего пользователя и захэшированный пароль
ну а теперь создание и редактирование пользователей.
поправим форму ввода \yii2rbac\backend\views\user\_form.php
field($model, 'username')->textInput(['maxlength' => true]) ?>
field($model, 'password_hash')->textInput(['maxlength' => true])->passwordInput() ?>
field($model, 'id_role')->textInput() ?>
field($model, 'comment')->textarea(['rows' => 6]) ?>
field($model, 'created_at')->textInput(['disabled' => true]) ?>
field($model, 'ban_date')->textInput(['disabled' => true]) ?>
field($model, 'status')->textInput() ?>
isNewRecord ? 'Create' : 'Update', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?>
добавим в модель пару методов \yii2rbac\backend\models\MyUser.php
use common\models\User; \\ вверху
public function signup()
{
if ($this->validate())
{
$user = new User();
$user->username = $this->username;
// $user->email = $this->email;
$user->setPassword($this->password_hash);
//$user->generateAuthKey();
if ($user->save())
{
return $user;
}
}
return null;
}
public function beforeSave($insert)
{
if (!$this->isNewRecord)
{
$command = static::getDb()->createCommand("SELECT password_hash FROM yii2.\"user\" where id =$this->id")->queryOne();
if ($command != $this->password_hash)
{
$this->password_hash = Yii::$app->security->generatePasswordHash($this->password_hash);
}
}
return parent::beforeSave($insert);
}
в модели еще поправим
public static function tableName()
{
return Yii::$app->params['pgschema'] . '.user';
}
а в yii2rbac\common\config\params.php добавим
'admin@example.com',
'supportEmail' => 'support@example.com',
'user.passwordResetTokenExpire' => 3600,
'domainName' => 'yii2rbac',
'pgschema' => 'yii2'
];
и поправим контроллер \yii2rbac\backend\controllers\UserController.php
public function actionCreate()
{
$model = new MyUser();
if ($model->load(Yii::$app->request->post()) && $model->signup())
{
return $this->redirect(['index']);
}
else
{
return $this->render('create', [
'model' => $model,
]);
}
}
public function actionUpdate($id)
{
$model = $this->findModel($id);
if ($model->load(Yii::$app->request->post()) && $model->save())
{
return $this->redirect(['view', 'id' => $model->id]);
}
else
{
return $this->render('update', [
'model' => $model,
]);
}
}
ну вот наверно и все. можем убрать из меню signup и пользователь сможет заходить только по паролю из базы
ну и в результате
Комментарии
Отправить комментарий