Как кастомизировать функцию validatePassword() из \vendor\yiisoft\yii2\base\Security.php?

Надо сделать, чтобы можно было использовать пароли ucoz.

Нужно внести всего пару изменений и все штатно заработает, но как это сделать. Я так понимаю, что в vendor это чревато потерей изменений при обновлении.
  • Вопрос задан
  • 291 просмотр
Решения вопроса 2
a_u_sinitsin
@a_u_sinitsin Автор вопроса
Не нашёл, как сделать через DI... на вскидку сделал вот так, как ни странно, но оно заработало. Может поправите если что не так?

Добавил в common/config/main.php
'components' => [
        // ...
        'security' => [
            'class' => 'common\components\CommSecurity',
        ],
    ],


В common\components\ скопировал Security.php удалил всё содержимое компонента, кроме одной функции и переименовал в CommSecurity.php

<?php
namespace common\components;

use yii\base\Security;
use Yii;

class CommSecurity extends Security
{

    public function validatePassword($password, $hash)
    {

        if (!is_string($password) || $password === '') {
            throw new InvalidParamException('Password must be a string and cannot be empty.');
        }

        if (function_exists('password_verify')) {
            return password_verify($password, $hash);
        }

        $test = crypt($password, $hash);
        $n = strlen($test);
        if (($n !== 60) && ($n !== 30)) {
            return false;
        }

        return $this->compareString($test, $hash);
    }

}
Ответ написан
Комментировать
fornit1917
@fornit1917
В Yii2 есть механизм dependecy injection. Вы компонент Security в вашем приложении можете подменить своей реализацией. В исходники из vendor, разумеется, влезать не надо.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
SamDark
@SamDark
Yii2 core team
Сделайте отдельный класс. Не стоит трогать Security. Тот, кто будет заниматься проектом после вас, скажет вам спасибо.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы