Предыстория:
Начинаю изучать yii2, ранее говнокодил, потом был перерыв около 2 лет. сейчас жизненно необходимо самостоятельно во все вникнуть.
Пробежался по документации, пообщался с некоторыми кодерами, hello world написал и даже лендинг натянул на фреймворк. Написал какую то авторизацию-велосипед в админке, но работает оно мягко говоря не так как должно.
Сейчас изучение уперлось в осознании того как сделать авторизацию в админке.
Как хочу организовать админку:
1. Контроллер "LoginController.php" - отвечает за авторизацию в админке. Запускается по умолчанию. выводит форму логин/пароль, проверяет их правильность.
2. Если логин/пароль верные, то перенаправляет на контроллер(ы) админки. Минимум 1 админ-контроллер "AdminController.php" где уже будет интерфейс управления контентом.
3. До тех пор пока сессия сохраняется, человек работает в админке. Если он захочит принудительно зайти на страницу авторизации повторно, то его перекидывает в админку.
4. Как только сессия закончилась или была получена команда logout, то со всех админ контроллеров его будет перекидывать на авторизацию.
вроде по логике всё нормально.
СРАЗУ хочу предотвратить заявление - а вот готовое уже есть решение и встроенное или еще какое-то:
- такое не подойдет. Цель научиться, а не смотреть с недопониманием как оно работает. У меня и так с трудом складывается в голове как оно работает и откуда какие зависимости подтягивает и в каком порядке, хотя в документации все читал, а сейчас пришло время делать.
- гугл в помощь - гугл уже помог чем мог. Далеко не сразу здесь тему создал. Пытался как мог найти выход сам.
И так что имею:
Скриншот структуры приложения + конфиг: http://joxi.ru/krDxMXOIQX3Zrp
LoginController.php : http://joxi.ru/ZrJpMlXsqlNp2j
Код: Выделить всё
<?php
/**
* Created by PhpStorm.
* User: evgeny
* Date: 09.11.15
* Time: 12:14
*/
namespace backend\controllers;
use Yii;
use yii\filters\AccessControl;
use yii\web\Controller;
use yii\filters\VerbFilter;
use backend\models\LoginForm;
/**
* User controller
*/
class LoginController extends Controller
{
public function actionLogin()
{
// строка генерирует хэш пароля админа, ну или любой комбинации символов в ('admin');
//return Yii::$app->security->generatePasswordHash('admin');
// проверка правильности валидации формы (заполнено или нет), проверяет правила из rules
$model = new LoginForm();
if ($model->load(Yii::$app->request->post()) && $model->login()){
return $this->goHome();
}
else {
return $this->render('login', [
'model' => $model
]);
}
}
// функция выхода из сессии
public function actionLogout()
{
Yii::$app->user->logout();
return $this->goHome();
}
public function actionIndex()
{
return $this->render('index');
}
/**
* @inheritdoc
*/
public function actions()
{
return [
'error' => [
'class' => 'yii\web\ErrorAction',
],
];
}
}
Код: Выделить всё
<?php
/**
* Created by PhpStorm.
* User: evgeny
* Date: 08.11.15
* Time: 21:45
*/
namespace backend\models;
use Yii;
use yii\db\ActiveRecord;
use yii\web\IdentityInterface;
use yii\base\NotSupportedException;
class Login extends ActiveRecord implements IdentityInterface
{
public static function tableName()
{
return '{{%users}}';
}
public function attributeLabels(){
return [
'title' => 'Заголовок страницы',
'seotags' => 'СЕО теги',
'seodescript' => 'СЕО описание',
'content' => 'Содержимое страницы',
];
}
// если модель называется так же как и таблица, то указывать на таблицу не обязательно
/* public static function tableName(){
return 'pages';
}*/
public function rules(){
return [
[['title', 'content'], 'required']
];
}
// получает данные по ID
public static function findIdentity($id){
return self::findOne($id);
}
/**
* получает по токену инфу. для API используется. Долж
* @inheritdoc
*/
public static function findIdentityByAccessToken($token, $type = null)
{
throw new NotSupportedException('findIdentityByAccessToken is not implemented.');
}
/**
* получает ID авторизованного пользователя (админа) для авторизации
* @inheritdoc
*/
public function getId()
{
return $this->getPrimaryKey();
}
/**
* для API (скорее всего)
* @inheritdoc
*/
public function getAuthKey()
{
return $this->auth_key;
}
/**
* проверка вышеописанного auth_key
* @inheritdoc
*/
public function validateAuthKey($authKey)
{
return $this->getAuthKey() === $authKey;
}
}
models/LoginForm.php - хз как ее задействовать
Код: Выделить всё
<?php
/**
* Created by PhpStorm.
* User: evgeny
* Date: 08.11.15
* Time: 21:42
*/
namespace backend\models;
use Yii;
use yii\base\Model;
use backend\models\Users;
class LoginForm extends Model {
public $login; //объявляем переменную login
public $password;
protected $_user; // юзера которого мы нашли в бд записываем в эту переменную
/**
* Правила проверки
* @inheritdoc
*/
public function rules(){
return [
[['login', 'password'], 'required'],
['login', 'userValidate'],
];
}
// проверяем наличие такого логина
public function userValidate()
{
$this->_user = Login::find()->where('login = :login ', [':login' => $this->login])->one();
if ($this->_user === null){
$this->addError('login', 'Пользователь не найден');
}
// если все таки нашелся такой юзер, то проверяем соответствие пароля встроенной функцией, сопоставляя пароль из POST и пароль из найденного по логину юзера
elseif (Yii::$app->security->validatePassword($this->password, $this->_user->password) === false) {
// указываем к полю password ошибку 'пароль не верен'
$this->addError('password', 'Пароль не верен');
}
}
public function login(){
// проверяем правила rules, если валидация пройдена
if ($this->validate()){
//если валидация прошла по rules, то настраивается сессия для аюзера на XXX сек.
if (Yii::$app->user->login($this->_user, 20)){
return true;
}
// если сессию настроить не удалось
else {
$this->addError('login', 'Авторизация не удалась по ну очень редкой причине :-) ');
}
}
// после первого ретурна функция прекращает выполнение и до нижнего ретурна дело не доходит
return false;
}
}
http://joxi.ru/52aRl7kFLqBOA0
А по идее должно быть вот это, а доступ к предыдущему "Congratulations" должен быть закрыт
http://joxi.ru/BA0RoPpFGXdVmy
Возможно как то behavirous надо настроить. Что делать то?