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

попробуем разобраться как работает авторизация в 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

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

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

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

Комментарии

Популярные сообщения из этого блога

Пишем логи на C# (.NET). Легкий способ.

Учебник yii2