Страница 1 из 1

Проблемы с Yii::$app->getSecurity()->generateRandomKey()

Добавлено: 2014.07.30, 15:55
belkod
Приветствую!

Ветка dev.

При регистрации возникает интересная ситуация, этот кусок кода генерит ключ:

Код: Выделить всё

$security = Yii::$app->getSecurity();
$this->auth_key = $security->generateRandomKey();
 
дамп таблицы:

Код: Выделить всё

CREATE TABLE IF NOT EXISTS `tbl_users` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL DEFAULT '',
  `username` varchar(150) NOT NULL DEFAULT '',
  `email` varchar(100) NOT NULL DEFAULT '',
  `password` varchar(100) NOT NULL DEFAULT '',
  `usertype` varchar(25) NOT NULL DEFAULT '',
  `block` tinyint(4) NOT NULL DEFAULT '0',
  `sendEmail` tinyint(4) DEFAULT '0',
  `registerDate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `lastvisitDate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `activation` varchar(100) NOT NULL DEFAULT '',
  `params` text NOT NULL,
  `lastResetTime` datetime NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT 'Date of last password reset',
  `resetCount` int(11) NOT NULL DEFAULT '0' COMMENT 'Count of password resets since lastResetTime',
  `allowgid` tinyint(4) unsigned NOT NULL DEFAULT '0',
  `auth_key` varchar(255) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `usertype` (`usertype`),
  KEY `idx_name` (`name`),
  KEY `idx_block` (`block`),
  KEY `username` (`username`),
  KEY `email` (`email`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=177 ;
 
Ошибок в коде не происходит, т.к. данные записываются, и далее идет запись группы юзера.
Идет запись в таблицу:

Код: Выделить всё

INSERT INTO `tbl_users` (`allowgid`, `name`, `username`, `email`, `registerDate`, `password`, `block`, `auth_key`) VALUES (1, 'test', 'email@email.com', 'email@email.com', NOW(), '$2y$13$q.WUMYB.7K3YpiMTpvgMxO3FvZVr5/Qmh18TGtv/lfbFao8VIDv4m', 1, '3{pB«e*i.:X#1ZZcA')
 
так вот, ошибок не происходит, но поле 'auth_key' получается пустым или с несколькими начальными символами.

НО, если этот же запрос сделать через phpmyadmin, то данные пишутся ВСЕ!

Как-то я не понимаю, что происходит ....

Re: Проблемы с Yii::$app->getSecurity()->generateRandomKey()

Добавлено: 2014.07.30, 21:06
zelenin
подтверждаю

Re: Проблемы с Yii::$app->getSecurity()->generateRandomKey()

Добавлено: 2014.07.30, 21:17
Nafania
Раньше generateRandomKey(), если мне память не изменяет, выдавал только ASCII символы, а теперь выдает все, втч и NULL.
Здесь два варианта решения, или используйте тип BINARY для хранения (или BYTEA в постгре) или вместо этого метода юзайте метод generateRandomString(), который выдает только ASCII.

Через phpmyadmin ессно все проходит, потому что в логе вы видите только печатаемые символы.

Re: Проблемы с Yii::$app->getSecurity()->generateRandomKey()

Добавлено: 2014.07.30, 21:24
belkod
Я вот не понимаю такой упертости разработчиков в супер-пупер методах шифрации и криптографии. Да нафиг никому не сдались эти пароли. Если смогут спионерить БД, то смогут туда же внедрить и свою запись и перекинуть на нее связи.
С моей точки зрения все эти методы генерации ключей, шифрации паролей и прочей ерунды можно бы вынести в отдельный механизм. В принципе так оно щаз и есть. Но изначально в движке делать запупенную шифрацию... Тогда уж лучше бы набор классов, подключаемых через конфигурацию к примеру. нужно чего попроще - да плиз, юзайте md5(), нужно че круче, юзайте sha1 и т.д.

Кароче, сей затык кода я решил простым md5(), простой число-буквенный короткий код.

Рассмотрю другие варианты моего психоза )))

Re: Проблемы с Yii::$app->getSecurity()->generateRandomKey()

Добавлено: 2014.07.30, 21:25
belkod
Nafania писал(а):Раньше generateRandomKey(), если мне память не изменяет, выдавал только ASCII символы, а теперь выдает все, втч и NULL.
+100500, в бета-версии движка был ASCII, и прекрасно все работало...

Re: Проблемы с Yii::$app->getSecurity()->generateRandomKey()

Добавлено: 2014.07.30, 21:26
Nafania
belkod писал(а):Я вот не понимаю такой упертости разработчиков в супер-пупер методах шифрации и криптографии. Да нафиг никому не сдались эти пароли. Если смогут спионерить БД, то смогут туда же внедрить и свою запись и перекинуть на нее связи.
С моей точки зрения все эти методы генерации ключей, шифрации паролей и прочей ерунды можно бы вынести в отдельный механизм. В принципе так оно щаз и есть. Но изначально в движке делать запупенную шифрацию... Тогда уж лучше бы набор классов, подключаемых через конфигурацию к примеру. нужно чего попроще - да плиз, юзайте md5(), нужно че круче, юзайте sha1 и т.д.

Кароче, сей затык кода я решил простым md5(), простой число-буквенный короткий код.

Рассмотрю другие варианты моего психоза )))
Так вынесите, кто ж вам мешает. Напишите компонент и используйте его. Фреймворк в бете и какие-то вещи меняются. Используя бету вы принимаете то, что могут быть изменения, которые могут поломать ваш код.

Re: Проблемы с Yii::$app->getSecurity()->generateRandomKey()

Добавлено: 2014.07.30, 21:27
belkod
Nafania писал(а):и вместо этого метода юзайте метод generateRandomString(), который выдает только ASCII.
Хотел его использовать, но решил все же спросить, реально такая шляпа или это мои кривые глюки.

Re: Проблемы с Yii::$app->getSecurity()->generateRandomKey()

Добавлено: 2014.07.31, 12:31
Akulenok
Согласен с замудростью авторизации, появилась необходимость сделать авторизацию через email и пароль, я уже мозг сломал как это сделать, подскажите.
Делаю опционально, с настройками. Пока придумал вот что,
в контроллере

Код: Выделить всё

if($userSettings['auth'] == 2)
            $model = new LoginForm(['scenario' => 'authEmail']);
        else
            $model = new LoginForm();
а что дальше в рулс, запутался в этих бесконечных методах, уже пришла мысль все сделать как раньше через мд5 с солью, но боюсь перестанет работать Rbac

Re: Проблемы с Yii::$app->getSecurity()->generateRandomKey()

Добавлено: 2014.07.31, 13:34
zelenin
в advanced app есть авторизация. в чем загвоздка?

Re: Проблемы с Yii::$app->getSecurity()->generateRandomKey()

Добавлено: 2014.07.31, 15:22
Akulenok
я с advanced и взял код, перенес в basic
изменил форму логина ( мне надо в зависимости от опции авторизировать или по логину или по емаилу

Код: Выделить всё

<?php if($userSettings['auth'] == 1) : ?>
                <?= $form->field($model, 'username') ?>
            <?php else : ?>
                <?= $form->field($model, 'email') ?>
            <?php endif; ?>
в контроллере

Код: Выделить всё

if($userSettings['auth'] == 2)
            $model = new LoginForm(['scenario' => 'authEmail']);
        else
            $model = new LoginForm();
в модели LoginForm

Код: Выделить всё

[['username', 'password'], 'required', 'on' => 'default'],
            ['rememberMe', 'boolean'],
            ['password', 'validatePassword'],

            ['email', 'email'],
            ['email', 'required', 'on' => 'authEmail'],
пытаюсь вардампить
public function validatePassword()
но ничего не происходит, вероятно ошибка валидации, ведь при авторизации через мыло нет username.
1. не знаю как вывести ошибки валидации на экран.
2. Как поступить, сделать 2 сценария или можно обойтись одним?
3. Писать кучу новых методов для авторизации по Email или есть способ более красиво это сделать?
4. Может разумнее сделать еще одну модель LoginByEmail ?

Re: Проблемы с Yii::$app->getSecurity()->generateRandomKey()

Добавлено: 2014.07.31, 16:01
Akulenok
Все вопрос снят, сделал через новую модель

Re: Проблемы с Yii::$app->getSecurity()->generateRandomKey()

Добавлено: 2014.07.31, 16:41
yiijeka
generateRandomKey() лучше сменить на $this->auth_key = \Yii::$app->security->generateRandomString();

у меня при RESTAPI возникли из-за этого проблемы с БД тоже глюк был.

PS УПС просмотрел -изменили это по умолчанию тоже