Авторизация yii 2 из базы

June 29, 2015

попробуем разобраться как работает авторизация в yii 2.если начинаете с нуля то

   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

перед миграцией нужно настроить подключение к базе.

в localhostyii2rbaccommonconfigmain-local.php поменяем

    'components' => [
        'db' => require(__DIR__ . '/db.php'),

создадим под коннект файл db.php


ну и зададим свои настройки

 'yiidbConnection',
//'dsn' => 'mysql:host=localhost;dbname=localdb',
'dsn' => 'pgsql:host=***.ru;port=5432;dbname=DB_**',
'username' => 'postgres',
'password' => '****',
'schemaMap' => [
'pgsql' => [
'class' => 'yiidbpgsqlSchema',
'defaultSchema' => 'yii2' //specify your schema here
]
],
'charset' => 'utf8',
];

я использую Postgres - здесь еще нужно схему указать

пошутил. конечно это не будет работать ))))

в yii2rbaccommonmodelsUser.php

напрямую правим

    public static function tableName()
{
return 'yii2.';
}

тут пошли танцы с бубном. первоначальный вид таблицы мне конечно не понравился

решил привести таблицу юзера к такому виду


---
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
но боялся грохнуть то что есть.

пойдем по файлам

localhostyii2rbaccommonmodelsUser.php

комментим

//use yiibehaviorsTimestampBehavior; 

- нужно для временных (int это время? кхе-кхе) полей

    public function behaviors()
{
return [
// TimestampBehavior::className(),
];
}

тоже в топку

yii2rbacfrontendmodelsSignupForm.php
сносим все что относится к емэйлу

 'trim'],
['username', 'required'],
['username', 'unique', 'targetClass' => 'commonmodelsUser', 'message' => 'This username has already been taken.'],
['username', 'string', 'min' => 2, 'max' => 255],
// [ 'filter', 'filter' => 'trim'],
// ['email', 'required'],
// ['email', 'email'],
// [ 'unique', 'targetClass' => 'commonmodelsUser', '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;
}
}


в yii2rbacfrontendviewssitesignup.php
удаляем поле мыла

получаем примерно


создадим модель в gii


и круд


получим


можете перейти по http://localhost/yii2rbac/backend/web/index.php/user
и увидите своего пользователя и захэшированный пароль

ну а теперь создание и редактирование пользователей.
поправим форму ввода yii2rbacbackendviewsuser_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']) ?>

 

добавим в модель пару методов yii2rbacbackendmodelsMyUser.php

use commonmodelsUser;  вверху

 

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';
}

а в yii2rbaccommonconfigparams.php добавим

 'admin@example.com',
'supportEmail' => 'support@example.com',
'user.passwordResetTokenExpire' => 3600,
'domainName' => 'yii2rbac',
'pgschema' => 'yii2'
];

и поправим контроллер yii2rbacbackendcontrollersUserController.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 и пользователь сможет заходить только по паролю из базы

ну и в результате


ну и следующая тема про rbac


Source: des1roer.blogspot.com

Комментарии

comments powered by Disqus