https://www.yiiframework.com/doc/guide/ ... stallation
По сути там уже всё готово из коробки.
По дефолту 2 пользователя
1. логин: admin, пароль: admin
2. логин: demo, пароль: demo
P.S.
https://www.yiiframework.com/doc/guide/ ... entication
https://www.yiiframework.com/doc/guide/ ... stallation
Вначале с массивом попробуй: авторизация работает? походи по страницам.espltdmh50 писал(а): ↑2018.06.18, 16:10 Смотрите. Изначально у нас проект инсталлируется с массивом юзеров (admin, demo), которые находятся в модели User. Если абстрагироваться от видео., и не предпринимать никаких действий, могу сказать, что авторизация работает. Но мне надо юзеров из базы. Если не делать как на видео, то где именно я должен получить юзера из базы? Метод который представлен на видео он же почти весь по докам сделан. В чем тогда подвох?
Код: Выделить всё
composer create-project --prefer-dist yiisoft/yii2-app-basic basic
Код: Выделить всё
php yii migrate/create create_user_table
Код: Выделить всё
<?php
use yii\db\Migration;
/**
* Handles the creation of table `user`.
*/
class m180618_132642_create_user_table extends Migration
{
/**
* {@inheritdoc}
*/
public function safeUp()
{
$tableOptions = null;
if ($this->db->driverName === 'mysql') {
// http://stackoverflow.com/questions/766809/whats-the-difference-between-utf8-general-ci-and-utf8-unicode-ci
$tableOptions = 'CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE=InnoDB';
}
$this->createTable('{{%user}}', [
'id' => $this->primaryKey()->comment('ID'),
'username' => $this->string()->notNull()->unique()->comment('Username'),
'auth_key' => $this->string(32)->notNull()->comment('Authorization Key'),
'password_hash' => $this->string()->notNull()->comment('Hash Password'),
'password_reset_token' => $this->string()->unique()->comment('Password Token'),
'email_confirm_token' => $this->string()->comment('Email Confirm Token'),
'email' => $this->string()->notNull()->unique()->comment('Email'),
'status' => $this->smallInteger()->notNull()->defaultValue(0)->comment('Status'),
'created_at' => $this->integer()->notNull()->comment('Created'),
'updated_at' => $this->integer()->notNull()->comment('Updated'),
], $tableOptions);
}
/**
* {@inheritdoc}
*/
public function safeDown()
{
$this->dropTable('{{%user}}');
}
}
Код: Выделить всё
php yii migrate
Код: Выделить всё
<?php
namespace app\models;
use Yii;
use yii\db\ActiveRecord;
use yii\web\IdentityInterface;
use yii\behaviors\TimestampBehavior;
/**
* This is the model class for table "{{%user}}".
*
* @property int $id ID
* @property string $username Username
* @property string $auth_key Authorization Key
* @property string $password_hash Hash Password
* @property string $password_reset_token Password Token
* @property string $email_confirm_token Email Confirm Token
* @property string $email Email
* @property int $status Status
* @property int $created_at Created
* @property int $updated_at Updated
*/
class User extends ActiveRecord implements IdentityInterface
{
/**
* Users Statuses
*/
const STATUS_BLOCKED = 0;
const STATUS_ACTIVE = 1;
const STATUS_WAIT = 2;
const STATUS_DELETED = 3;
/**
* {@inheritdoc}
*/
public static function tableName()
{
return '{{%user}}';
}
/**
* @return array
*/
public function behaviors()
{
return [
'timestamp' => [
'class' => TimestampBehavior::class,
],
];
}
/**
* {@inheritdoc}
*/
public function rules()
{
return [
[['username', 'email'], 'required'],
[['status', 'created_at', 'updated_at'], 'integer'],
[['username', 'password_hash', 'email'], 'string', 'max' => 255],
[['auth_key'], 'string', 'max' => 32],
[['username'], 'unique'],
[['email'], 'unique'],
[['password_reset_token'], 'unique'],
];
}
/**
* {@inheritdoc}
*/
public function attributeLabels()
{
return [
'id' => 'ID',
'username' => 'Username',
'auth_key' => 'Authorization Key',
'password_hash' => 'Hash Password',
'password_reset_token' => 'Password Token',
'email_confirm_token' => 'Email Confirm Token',
'email' => 'Email',
'status' => 'Status',
'created_at' => 'Created',
'updated_at' => 'Updated',
];
}
/**
* @return array
*/
public static function getStatusesArray()
{
return [
self::STATUS_BLOCKED => Yii::t('app', 'Blocked'),
self::STATUS_ACTIVE => Yii::t('app', 'Active'),
self::STATUS_WAIT => Yii::t('app', 'Wait'),
self::STATUS_DELETED => Yii::t('app', 'Deleted'),
];
}
/**
* @param int|string $id
* @return \yii\web\IdentityInterface
*/
public static function findIdentity($id)
{
$result = static::findOne(['id' => $id, 'status' => self::STATUS_ACTIVE]);
return $result;
}
/**
* @param mixed $token
* @param null $type
* @return \yii\web\IdentityInterface
*/
public static function findIdentityByAccessToken($token, $type = null)
{
$result = static::findOne(['auth_key' => $token, 'status' => self::STATUS_ACTIVE]);
return $result;
}
/**
* @return int|string
*/
public function getId()
{
return $this->id;
}
/**
* @return string
*/
public function getAuthKey()
{
return $this->auth_key;
}
/**
* @param string $authKey
* @return bool
*/
public function validateAuthKey($authKey)
{
return $this->getAuthKey() === $authKey;
}
/**
* @param string $username
* @return mixed
*/
public static function findByUsername($username)
{
return static::findOne(['username' => $username, 'status' => self::STATUS_ACTIVE]);
}
/**
* @throws \yii\base\Exception
*/
public function generateAuthKey()
{
$this->auth_key = Yii::$app->security->generateRandomString();
}
/**
* @param string $password
* @throws \yii\base\Exception
*/
public function setPassword($password)
{
$this->password_hash = Yii::$app->security->generatePasswordHash($password);
}
/**
* @throws \yii\base\Exception
*/
public function generatePasswordResetToken()
{
$this->password_reset_token = Yii::$app->security->generateRandomString() . '_' . time();
}
/**
* removePasswordResetToken
*/
public function removePasswordResetToken()
{
$this->password_reset_token = null;
}
/**
* removeEmailConfirmToken
*/
public function removeEmailConfirmToken()
{
$this->email_confirm_token = null;
}
/**
* @param $token
* @return User|null
*/
public static function findByPasswordResetToken($token)
{
if (!static::isPasswordResetTokenValid($token)) {
return null;
}
return static::findOne([
'password_reset_token' => $token,
'status' => self::STATUS_ACTIVE,
]);
}
/**
* @param $email_confirm_token
* @return User|null
*/
public static function findByEmailConfirmToken($email_confirm_token)
{
return static::findOne([
'email_confirm_token' => $email_confirm_token,
'status' => self::STATUS_WAIT
]);
}
/**
* @throws \yii\base\Exception
*/
public function generateEmailConfirmToken()
{
$this->email_confirm_token = Yii::$app->security->generateRandomString();
}
/**
* @param $password
* @return bool
*/
public function validatePassword($password)
{
return Yii::$app->security->validatePassword($password, $this->password_hash);
}
/**
* @param $token
* @return bool
*/
public static function isPasswordResetTokenValid($token)
{
if (empty($token)) {
return false;
}
$expire = 3600; //Yii::$app->params['users.passwordResetTokenExpire'];
$parts = explode('_', $token);
$timestamp = (int)end($parts);
return $timestamp + $expire >= time();
}
}
Код: Выделить всё
<?php
namespace app\commands;
use Yii;
use app\models\User;
use yii\console\Controller;
use yii\console\Exception;
use yii\helpers\Console;
/**
* Class UserController
* @package app\commands
*/
class UserController extends Controller
{
/**
* All commands
* @inheritdoc
*/
public function actionIndex()
{
echo 'yii user/create' . PHP_EOL;
echo 'yii user/remove' . PHP_EOL;
echo 'yii user/activate' . PHP_EOL;
echo 'yii user/change-password' . PHP_EOL;
}
/**
* Create new user
* @inheritdoc
*/
public function actionCreate()
{
$model = new User();
$this->readValue($model, 'username');
$this->readValue($model, 'email');
$model->setPassword($this->prompt(self::convertEncoding(Yii::t('app', 'Password:')), [
'required' => true,
'pattern' => '#^.{6,255}$#i',
'error' => self::convertEncoding(Yii::t('app', 'More than 6 symbols')),
]));
$model->generateAuthKey();
if (($select = self::convertEncoding(User::getStatusesArray())) && is_array($select)) {
$model->status = $this->select(self::convertEncoding(Yii::t('app', 'Status:')), $select);
$this->log($model->save());
} else {
$this->log();
}
}
/**
* Remove user
* @throws Exception
* @throws \Exception
* @throws \Throwable
*/
public function actionRemove()
{
$username = $this->prompt(self::convertEncoding(Yii::t('app', 'Username:')), ['required' => true]);
$model = $this->findModel($username);
if ($model->delete() !== false) {
$this->log(true);
} else {
$this->log(false);
}
}
/**
* Change status user to Active
* @throws Exception
*/
public function actionActivate()
{
$username = $this->prompt(self::convertEncoding(Yii::t('app', 'Username:')), ['required' => true]);
$model = $this->findModel($username);
$model->status = User::STATUS_ACTIVE;
$model->removeEmailConfirmToken();
$this->log($model->save());
}
/**
* Change password user
* @throws Exception
* @throws \yii\base\Exception
*/
public function actionChangePassword()
{
$username = $this->prompt(self::convertEncoding(Yii::t('app', 'Username:')), ['required' => true]);
$model = $this->findModel($username);
$model->setPassword($this->prompt(self::convertEncoding(Yii::t('app', 'New password:')), [
'required' => true,
'pattern' => '#^.{6,255}$#i',
'error' => self::convertEncoding(Yii::t('app', 'More than 6 symbols')),
]));
$this->log($model->save());
}
/**
* @param string $username
* @throws \yii\console\Exception
* @return User the loaded model
*/
private function findModel($username)
{
if (!$model = User::findOne(['username' => $username])) {
throw new Exception(
self::convertEncoding(
Yii::t('app', 'User "{:Username}" not found', [':Username' => $username])
)
);
}
return $model;
}
/**
* @param \yii\base\Model $model
* @param string $attribute
*/
private function readValue($model = null, $attribute = '')
{
$model->$attribute = $this->prompt(self::convertEncoding(Yii::t('app', mb_convert_case($attribute, MB_CASE_TITLE, 'UTF-8') . ':')), [
'validator' => function ($input, &$error) use ($model, $attribute) {
/** @var string $input */
$model->$attribute = $input;
/** @var \yii\base\Model $model */
if ($model->validate([$attribute])) {
return true;
} else {
$error = self::convertEncoding(implode(',', $model->getErrors($attribute)));
return false;
}
},
]);
}
/**
* @param bool|int $success
*/
private function log($success = false)
{
if ($success === true || $success !== 0) {
$this->stdout(self::convertEncoding(Yii::t('app', 'Success!')), Console::FG_GREEN, Console::BOLD);
} else {
$this->stderr(self::convertEncoding(Yii::t('app', 'Error!')), Console::FG_RED, Console::BOLD);
}
echo PHP_EOL;
}
/**
* @param $string
* @param string $code
* @param string $to
* @return array|null|string|string[]
*/
public static function convertEncoding($string, $code = 'cp866', $to = 'UTF-8')
{
if (is_array($string)) {
$strings = [];
foreach ($string as $key => $value) {
$strings[$key] = mb_convert_encoding($value, $code, $to);
}
return $strings;
}
return mb_convert_encoding($string, $code, $to);
}
}
Код: Выделить всё
php yii user/create
Код: Выделить всё
Username: admin
Email: admin@example.loc
Password: 123456
Status: [0,1,2,3,?]:1
Success!
Код: Выделить всё
[Session]
session.save_handler = files
session.save_path = "%sprogdir%/userdata/temp/"
session.use_cookies = 1
;session.cookie_secure =
session.use_only_cookies = 1
session.name = PHPSESSID
session.auto_start = 0
session.cookie_lifetime = 0
session.cookie_path = /
session.cookie_domain =
session.cookie_httponly =
session.serialize_handler = php
session.gc_probability = 1
session.gc_divisor = 1000
session.gc_maxlifetime = 1440
session.bug_compat_42 = On
session.bug_compat_warn = On
session.referer_check =
;session.entropy_length = 32
;session.entropy_file = /dev/urandom
session.cache_limiter = nocache
session.cache_expire = 180
session.use_trans_sid = 0
session.hash_function = 0
session.hash_bits_per_character = 5
url_rewriter.tags = "a=href,area=href,frame=src,input=src,form=fakeentry"
;session.upload_progress.enabled = On
;session.upload_progress.cleanup = On
;session.upload_progress.prefix = "upload_progress_"
;session.upload_progress.name = "PHP_SESSION_UPLOAD_PROGRESS"
;session.upload_progress.freq = "1%"
;session.upload_progress.min_freq = "1"
потому что, не знаю зачем, коллеги предлагают какие-то эксперементы.
скажите пожалуйста, вот вы пишите, что не надо править модели, только конфиги, а как тогда юзеров из БД доставать не правя ничего?skynin писал(а): ↑2018.06.19, 11:16потому что, не знаю зачем, коллеги предлагают какие-то эксперементы.
Еще раз.
Фреймворк Yii2, в обоих поставках, basic и advanced УЖЕ содержит модель User, с реализацией интерфейса IdentityInterface, УЖЕ содержит нужные контроллеры и вьюхи.
Для старта нужно править только конфиги. ВСЕ. никаких моделей, котроллеров, вьюх править не нужно.
В конфигах надо прописать всего-то - настройки базы данных, и сессий.
ВСЕ.
еще раз - ничего кроме конфигов править не нужно.
если для запуска базовой поставки Yii2 нужно что-то править в моделях, контроллерах, вьюхах - то значит:
1. недонастроены конфиги. или неправильно настроены. например что-то не в той секции, в имени параметра русская a вместо английской и т.п.
2. серверное или браузерное окружение настроено не стандартно
все. незачем копаться в коде фреймворка, если не выполнены 1 и 2ой пункт.
то есть если базовая поставка не работает, тесты не проходят.
сужайте сферу поиска причин проблемы, а не расширяейте правкой моделей, контроллеров, и т.д.
вы вначале запустите чистый проект, а потом уже будете доставать из базы.
Как раз базовый у него работает.
У него не получается всё это дело перевести на базу данных)espltdmh50 писал(а): ↑2018.06.18, 16:10 Смотрите. Изначально у нас проект инсталлируется с массивом юзеров (admin, demo), которые находятся в модели User. Если абстрагироваться от видео., и не предпринимать никаких действий, могу сказать, что авторизация работает. Но мне надо юзеров из базы. Если не делать как на видео, то где именно я должен получить юзера из базы? Метод который представлен на видео он же почти весь по докам сделан. В чем тогда подвох?
Тут всё готово.Dominus писал(а): ↑2018.06.19, 10:55 Пробуйте отсюда поставить: https://github.com/Dominus77/yii2-basic-start
вот этого и не пойму. что значит - перевести это дело в базу данных?
значит НЕ чистый.
а-а-а, вона как. тогда понятно, чего мне непонятно
Вообще то разница есть - у меня Линукс Минт, у вас? наверное, Windows. На боевом сервере тоже, кстати, будет Линукс. Это вам инф-ция к размышлению.espltdmh50 писал(а): ↑2018.06.19, 10:49 Если честно, откровенно говоря у меня шок. Все один в один. Ни шагу влево или вправо.