DbHelp.ru
Маленький Yii блог
Комментарии
Гость: комент
Гость: wahaha
zolter: Друпал на Yii? ))
nastia: http://drupal.org/
JB: Да там просто ад)) мне всего 3 значения нужно чтобы выпадало, все равно спасибо)...



Сервер Ultima Online - Forest Wars (от создателя данного блога)

Урок 6 : Регистрация и авторизация. Часть 2

Рубрика: Создаем блог вместе

Оцените эту статью:

Рейтинг: 0.00 (0)
2 Июл. 2009
Опубликовать в Twitter Написать в Facebook Опубликовать в своем блоге livejournal.com

Эта статья устарела т.к. была написана для yii версии 1.0.х; Если вы используете более новую версию - у вас могут возникнуть ошибки из-за несовместимости. Обычно ответы на все вопросы работы на 1.1.х были описаны в комментариях ниже статьи.

Продолжение...

---

Я надеюсь вы уже знакомы с прошлой частью урока, и настроились к познанию нового материала :) Давайте немного вrспомним о том что было в прошлой части и что у нас уже готово:

  • форма поле должно проверять правиломрегистрации
  • обработка формы. валидация полей (данных). сохранение данных
  • модель, контроллер и пару отображений

В этой части урока мы полностью закончим с авторизацией и регистрацией и сможем приступить к более серьезным (и интересным) вещам :)

Работаем с экшинсом

В прошлой части урока мы создали отдельный экшинс для регистрации, давайте сделаем нечто похожее и для авторизации. Открываем наш контроллер UserController.php и находим:

    /**
     * Метод входа на сайт
     *
     * Метод в котором мы выводим форму авторизации
     * и обрабатываем её на правильность.
     */
    public function actionLogin()
    {
    }   

И заменяем на :
    /**
     * Метод входа на сайт
     *
     * Метод в котором мы выводим форму авторизации
     * и обрабатываем её на правильность.
     */
    public function actionLogin()
    {
        $form = new User();
       
        // Проверяем является ли пользователь гостем
        // ведь если он уже зарегистрирован - формы он не должен увидеть.
        if (!Yii::app()->user->isGuest) {
            throw new CException('Вы уже зарегистрированы!');
        } else {
            if (!empty($_POST['User'])) {
                $form->attributes = $_POST['User'];
                $form->verifyCode = $_POST['User']['verifyCode'];

                    // Проверяем правильность данных
                    if($form->validate('login')) {
                        // если всё ок - кидаем на главную страницу
                        $this->redirect(Yii::app()->homeUrl);
                    }
            }
            $this->render('login', array('form' => $form));
        }
    }   

Форма

Конструкция очень похожа на actionRegistration() поэтому я не делал сильно много комментариев.

Как вы уже поняли по коду - форма у нас будет находиться в файле login. Поэтому заходим views/user/ и создаем файл login.php:

<h1>Авторизация</h1>

<?=CHtml::form(); ?>
<?=CHtml::errorSummary($form); ?><br>

    <table id="form2" border="0" width="400" cellpadding="10" cellspacing="10">
        <tr>
            <td width="150"><?=CHtml::activeLabel($form, 'login'); ?></td>
            <td><?=CHtml::activeTextField($form, 'login') ?></td>
        </tr>
        <tr>
            <td><?=CHtml::activeLabel($form, 'passwd'); ?></td>
            <td><?=CHtml::activePasswordField($form, 'passwd') ?></td>
        <tr>
        <tr>
            <td><?php $this->widget('CCaptcha', array('buttonLabel' => '<br>[новый код]')); ?></td>
            <td><?=CHtml::activeTextField($form,'verifyCode'); ?></td>
        </tr>
        <tr>
            <td></td>
            <td><?=CHtml::submitButton('Войти', array('id' => "submit")); ?></td>
        </tr>
    </table>

<?=CHtml::endForm(); ?>

Почти аналогичная форма как и у регистрации (только без поля повтора пароля). Хотел бы обратить внимание что на форме авторизации я оставил поле капчи (для того чтобы боты не авторизировались самостоятельно).

Теперь заходим на страницу localhost/user/login/ и видим красивую формочку :)
Можете даже попробовать ввести в неё какие то не правильные данные (указать неверный код капчи, использовать короткий логин/пароль) и убедиться что наши правила работают :)

Если вы введете верные данные - вас просто переведет на главную страницу. Механизм сохранения мы еще не писали, поэтому это нормально.

UserIdentity

Как вы понимаете сам процесс аутентификации уже был вложен в Yii и от нас требуется лишь наследовать класс CUserIdentity и пере определить метод authenticate под свои нужды.

Если вам вдруг будет непонятно про Identity, вы можете прочитать статью про авторизацию вот тут.

В authenticate мы проверим совпадают ли введённые данные (логин/пароль) с тем что у нас есть в базе данных. Заходим в protected/ и создаем там папку components, а в ней файл UserIdentity.php:

 class UserIdentity extends CUserIdentity
{
    private $_id;
    public function authenticate()
    {
        // Есть ли указанный пользователь в базе данных
        $record=User::model()->findByAttributes(array('login'=>$this->username));
        if($record===null)
            // Если нету - сохраняем в errorCode ошибку.
            $this->errorCode=self::ERROR_USERNAME_INVALID;
        else if($record->passwd!==$this->password)
            // Проверяем совпадает ли введенный пароль с тем что у нас в базе
            // Если не совпадает - сохраняем в errorCode ошибку.
            $this->errorCode=self::ERROR_PASSWORD_INVALID;
        else
        {
            // Если все действий выше успешно пройдены - значит
            // пользователь действительно существует и пароль был
            // указан верно.
            $this->_id=$record->id;
            // В errorCode сохраняем что ошибок нет
            $this->errorCode=self::ERROR_NONE;
        }
        return !$this->errorCode;
    }
 
    public function getId()
    {
        return $this->_id;
    }
}

Давайте разберем что мы написали выше.

  1. Мы создали класс UserIdentity с наследованием от CUserIdentity
  2. Пере определили метод authenticate() в которой сделали проверку на наличие такого логина в базе, а после этого проверка на совпадение пароля.
  3. Метод возвращает у нас errorCode. Если значение "ERROR_NONE" - значит ошибок нету.

Модель

Теперь нам надо в моделе создать специально правило для того что бы сразу проверять введенные логин/пароль нашим методом.

Открываем protected/models/User.php и в метод rules добавляем еще одно правило:

array('passwd', 'authenticate', 'on' => 'login'),

В конечном итоге rules у нас должны выглядеть следующим образом:

    /**
     * Правила валидации
     */
    public function rules()
    {
        return array(
            // логин, пароль не должны быть больше 128-и символов, и меньше трёх
            array('login, passwd', 'length', 'max'=>128, 'min' => 3),
            // логин, пароль не должны быть пустыми
            array('login, passwd', 'required'),
            // для сценария registration поле passwd должно совпадать с полем passwd2
            array('passwd', 'compare', 'compareAttribute'=>'passwd2', 'on'=>'registration'),
            // правило для проверки капчи что капча совпадает с тем что ввел пользователь
            array('verifyCode', 'captcha', 'allowEmpty'=>!extension_loaded('gd')),
            // проверка пароля нашим методом authenticate
            array('passwd', 'authenticate', 'on' => 'login'),
           array('login', 'match', 'pattern' => '/^[A-Za-z0-9А-Яа-я\s,]+$/u','message' => 'Логин содержит недопустимые символы.'),
       );
    }

Как вы уже помните - в массиве первым элементом я задал поле, которое должно быть проверенно правилом, а во втором параметре указал как должен называться метод для проверки. Теперь давайте создадим authenticate нашей модели.

Хочу заметить что в данном случае речь идет не про метод authenticate который мы создали в UserIdentity. В данном случае я просто использую точно такое же имя, но речь уже идет про метод authenticate который мы сейчас создадим в User.php

И так, ниже в этом же файле добавляем новый метод:

    /**
     * Собственное правило для проверки
     * Данный метод является связующем звеном с UserIdentity
     *
     * @param $attribute
     * @param $params
     */
    public function authenticate($attribute,$params)
    {
        // Проверяем были ли ошибки в других правилах валидации.
        // если были - нет смысла выполнять проверку
        if(!$this->hasErrors())
        {
            // Создаем экземпляр класса UserIdentity
            // и передаем в его конструктор введенный пользователем логин и пароль (с формы)
            $identity= new UserIdentity($this->login, $this->passwd);
            // Выполняем метод authenticate (о котором мы с вами говорили пару абзацев назад)
            // Он у нас проверяет существует ли такой пользователь и возвращает ошибку (если она есть)
            // в $identity->errorCode
            $identity->authenticate();
               
                // Теперь мы проверяем есть ли ошибка..   
                switch($identity->errorCode)
                {
                    // Если ошибки нету...
                    case UserIdentity::ERROR_NONE: {
                        // Данная строчка говорит что надо выдать пользователю
                        // соответствующие куки о том что он зарегистрирован, срок действий
                        // у которых указан вторым параметром.
                        Yii::app()->user->login($identity, 0);
                        break;
                    }
                    case UserIdentity::ERROR_USERNAME_INVALID: {
                        // Если логин был указан наверно - создаем ошибку
                        $this->addError('login','Пользователь не существует!');
                        break;
                    }
                    case UserIdentity::ERROR_PASSWORD_INVALID: {
                        // Если пароль был указан наверно - создаем ошибку
                        $this->addError('passwd','Вы указали неверный пароль!');
                        break;
                    }
                }
        }
    }

Я надеюсь логика работы вам в принципе понятна. Т.е. мы с вами написали правило (rules) которое проверяет поле passwd нашим методом authenticate. В нем мы обращаемся к классу UserIdentity и проверяем существует ли такой пользователь с таким паролем. Если все хорошо - методом login проводим "вход" пользователя.

Выход

Когда со "входом" на сайт мы разобрались, давайте сделаем "выход (log out)".
Для этого мы уже написали каркас экшинса в контроллере, который сейчас мы дополним.

Открываем protected/controllers/UserController.php и вместо:

    /**
     * Метод выхода с сайта
     *
     * Данный метод описывает в себе выход пользователя с сайта
     * Т.е. кнопочка "выход"
     */
    public function actionLogout()
    {
    }

делаем :

    /**
     * Метод выхода с сайта
     *
     * Данный метод описывает в себе выход пользователя с сайта
     * Т.е. кнопочка "выход"
     */
    public function actionLogout()
    {
        // Выходим
        Yii::app()->user->logout();
        // Перезагружаем страницу
        $this->redirect(Yii::app()->user->returnUrl);
    }

Всё достаточно просто.

Меню

Теперь что бы увидеть как это все работает - думаю есть смысл создать просто меню:

    <a href="<?=Yii::app()->createUrl("post/index");?>">Главная</a>
    <?php if (Yii::app()->user->isGuest): ?>
        <a href="<?=Yii::app()->createUrl("user/registration/");?>">Регистрация</a>
        <a href="<?=Yii::app()->createUrl("user/login/");?>">Вход</a>
    <?php else: ?>
        <a href="<?=Yii::app()->createUrl("user/logout/");?>">Выход (<?=Yii::app()->user->name?>)</a>
    <?php endif; ?>

Оно состоит из проверки является ли пользователь гостем. В зависимости от этого он будет видеть нужные пункты меню. К примеру для гостя это будет - регистрация и вход, а для авторизированного пользователя - кнопка выход.

Я не хочу сильно мудрить с выносом меню в отдельный файл и тп, поэтому мы просто добавим его в наш layouts. Открываем protected/views/layouts/main.php и добавляем в него код нашего меню:

<html>
<head>
    <title><?php echo $this->pageTitle; ?></title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <meta name="language" content="ru" />
    <meta name="robots" content="all" />
</head>
<body>

    <a href="<?=Yii::app()->createUrl("post/index/");?>">Главная</a>
    <?php if (Yii::app()->user->isGuest): ?>
        <a href="<?=Yii::app()->createUrl("user/registration/");?>">Регистрация</a>
        <a href="<?=Yii::app()->createUrl("user/login/");?>">Вход</a>
    <?php else: ?>
        <a href="<?=Yii::app()->createUrl("user/logout/");?>">Выход (<?=Yii::app()->user->name?>)</a>
    <?php endif; ?>
   
    <?php echo $content; ?>
</html>

Конец

Теперь всё работает. Заходите на localhost и смотрите сами :)

Исходники:



Если хотите опубликовать этот материал у себя - пожалуйста, разместите ссылку на страницу откуда вы его взяли.
Другие yii статьи:

  1. Эта статья устарела т.к. была написана для yii версии 1.0.х; Если вы используете более новую версию - у вас могут ... "Урок 6 : Регистрация и авторизация. Часть 2"

  2. Серия рецентов "By Example" пытается предоставить для разработчиков примеры использования самых распостраненных действий в Yii. Учимся использовать CHtml::listData() на ... ""By Example" : CHtml - listData()"

  3. Давайте сегодня поговорим что же такое “контроллер” и для чего он используется в приложениях на базе MVC next В уроке ... "Шаг 5 : Контроллер"

[guest] Гость

Было сказано: Четверг, 02 Июль 2009

Большое спасибо!

[guest] Maxx

Было сказано: Четверг, 02 Июль 2009

Спасибо!

[guest] Радик

Было сказано: Четверг, 02 Июль 2009

Спасибо за статью

[guest] 32

Было сказано: Четверг, 02 Июль 2009

Сенк

[guest] Гость

Было сказано: Четверг, 02 Июль 2009

Спасибо

Виталий

Было сказано: Четверг, 02 Июль 2009

На странице регистрации ввожу имя и дважды пароль - выдаёт ошибку: "Пользователя не существует". Удаляю метод authenticate($attribute,$params) из User.php - так регистрирует..

[adm] zolter

Было сказано: Четверг, 02 Июль 2009

Спасибо больше. 5 секунд подождите, отредактирую статью и скажу в чем была ошибка.

[adm] zolter

Было сказано: Четверг, 02 Июль 2009

Зайдите в модель (User.php) и измените строчку:

array('passwd', 'authenticate')

на:
array('passwd', 'authenticate', 'on' => 'login'),

проблемы бала в том что в on не было указанно для какого сценария должно срабатывать правило. поэтому при регистрации, срабатывало правило и проверяло есть ли такой пользователь с таким паролем xD теперь когда там явно указанно 'login', то правило будет применяться только при авторизации. (форма регистрации будет его игнорировать)

[adm] zolter

Было сказано: Четверг, 02 Июль 2009

Вам еще надо исправить ошибку в коде из прошлой статьи которую я описал вот в этом комментарии (http://www.dbhelp.ru/yii-auth-and-reg-1/page/#comment-344).

[guest] Влад

Было сказано: Четверг, 02 Июль 2009

Спасибо за статью!
Очень радует быстрое исправление своих ошибок

[guest] Гость

Было сказано: Четверг, 02 Июль 2009

Сенк!

[guest] lev

Было сказано: Пятница, 03 Июль 2009

кул!

[adm] zolter

Было сказано: Пятница, 03 Июль 2009

Скоро будет еще одна статья по этому уроку. (сегодня-завтра 100%)

[guest] ppy

Было сказано: Суббота, 04 Июль 2009

Спасибо за статью, но не раскрыта тема как проверять и отклонять запросы в контроллере если юзер не залогинен.

[adm] zolter

Было сказано: Воскресенье, 05 Июль 2009

Вы имеете ввиду контроль доступа залогиненых пользователей к отдельным экшинсам? Да действительно, сначало думал написать это всё в одной статье, но потом понял что сильно будет грузить голову (очень много инфы). Поэтому через пару уроков - обязательно рассмотрю этот вопрос но уже в качестве отдельной статьи.

[adm] zolter

Было сказано: Среда, 08 Июль 2009

В статью добавлена ссылка на рабочий проект. (rar) архив содержит в себе исходники всех предыдущих уроков + текущего урока. Что бы запустить его от вас требуется изменить немного index.php (прописать новый путь к yii) и config/main.php (логин пароль к базе)

[guest] patison

Было сказано: Понедельник, 20 Июль 2009

Поправочку можно?
Вот тут:

// Проверяем является ли пользователь гостем
// ведь если он уже зарегистрирован - формы он не должен увидеть.
if (!Yii::app()->user->isGuest) {
throw new CException('Вы уже зарегистрированы!');

Советую везде слово ЗАРЕГИСТРИРОВАН заменить на АВТОРИЗИРОВАН, а то немного вводит в заблуждение :)

[adm] zolter

Было сказано: Понедельник, 20 Июль 2009

Да, вы правы :)
Сегодня поменяю :)

[guest] Maxxdev

Было сказано: Понедельник, 02 Ноябрь 2009

После перехода на версию 1.1 столкнулся с тем, что при авторизации не вызывается метод public function authenticate($attribute,$params) модели User.php. Копал копал, причиной оказалось выражение
array('passwd', 'authenticate', 'on' => 'login').
array('passwd', 'authenticate') - работает. Кто нибудь знает причину столь странного поведения?

[adm] zolter

Было сказано: Вторник, 03 Ноябрь 2009

Да. Я уже столкнулся с этим.

В методе validate теперь первый парраметр это не название сценария, а список атрибутов которые надо проверять. Или если null - тогда все атрибуты участвуют в валидации. Как я понял название сценария теперь надо задавать иначе. вместо:

if ($model->validate('test')) {
...
}

делаю:

$model->scenario = 'test';
if ($model->validate()) {
...
}

Я так решил эту проблему.

[adm] zolter

Было сказано: Вторник, 03 Ноябрь 2009

Вот как было раньше:
http://www.yiiframework.com/doc/api/1.0.10/CModel#validate-detail

т.е. два параметра, первый сценарий, второй список атрибутов если надо. А сейчас вот так:

http://www.yiiframework.com/doc/api/CModel#validate-detail

т.е. без названия сценария

В описании этого параметра там написано что он считается устаревшим с версии 1.0.4, наверно поэтому в новой ветке его убрали вовсе. Вместо него рекомендуют использовать тот подход который я описал выше

[guest] Maxxdev

Было сказано: Среда, 04 Ноябрь 2009

Т.е. сейчас правильным будет использовать
array('passwd', 'authenticate') вместо
array('passwd', 'authenticate', 'on' => 'login') ?

[adm] zolter

Было сказано: Среда, 04 Ноябрь 2009

Не. В самой модели вы ничего не меняете. Просто из-за того что разработчик поменял 1 парраметр - ваша модель не понимает что сейчас используется сценарий "login". Поэтому правило array('passwd', 'authenticate', 'on' => 'login') не отрабатывает.

В контроллере где вы сейчас проводите валидацию у вас наверно есть строчка:

if ($model->validate('login')) {
}


так вот её надо заменить на:
$model->scenario = 'test';
if ($model->validate()) {
}


т.е. название сценария теперь ненадо передавать в функцию validate, а надо указывать в парраметр scenario.

п.с. вместо validate возможно вы используете save('login'), в этом случае все тоже идентично.

[adm] zolter

Было сказано: Среда, 04 Ноябрь 2009

Если мы с вами говорим о статье которая написанна выше, то в ней строчку:

// Проверяем правильность данных
if($form->validate('login')) {
// если всё ок - кидаем на главную страницу
$this->redirect(Yii::app()->homeUrl);
}


надо заменить на :

// Проверяем правильность данных
$model->scenario = 'login';
if($form->validate()) {
// если всё ок - кидаем на главную страницу
$this->redirect(Yii::app()->homeUrl);
}

[guest] Maxxdev

Было сказано: Среда, 04 Ноябрь 2009

Точнее не $model->scenario = 'login';
а $form->scenario = 'login';
Вариант с $form->validate('login') мне кажется был более красивым решением =)

[adm] zolter

Было сказано: Среда, 04 Ноябрь 2009

Сенк ) то копи-паст сбивает :)

да старый вариант конечно был красивее, не знаю зачем так сделали

[guest] Dima

Было сказано: Понедельник, 09 Ноябрь 2009

Нашел интересную тему на форуме yii

http://www.yiiframework.com/forum/index.php?/topic/3133-registration-forms-little-tips/page__st__20

Регистрация с подтверждением email.
Для восстановления пароля используется секретный вопрос.
Вообщем все дела ;)

[adm] zolter

Было сказано: Понедельник, 09 Ноябрь 2009

Да, интересная :)

[guest] alexandrov

Было сказано: Понедельник, 01 Февраль 2010

после того как прохожу аутентификацию, делается переход на главную, но в меню стоит опять же ссылка "Вход", с чем это связано?

[guest] zolter

Было сказано: Понедельник, 01 Февраль 2010

Может в браузере куки отключены?

[guest] alexandrov

Было сказано: Четверг, 04 Февраль 2010

пробовал в двух браузерах...ну лан, наверное только у меня не работает. жду от автора продолжения статей по построению биллинга - оч. интересно!

[adm] zolter

Было сказано: Четверг, 04 Февраль 2010

Как раз проектирую базу для биллинга :)

[guest] rummer

Было сказано: Пятница, 26 Февраль 2010

Может метод getId() по какой то причине не перегружаться???


private $_id;

public function authenticate()
{
$login =$this->username;
$password = md5($this->password);
$user = User::model()->find("login=? AND password=?", array($login,$password));
if($user){
$this->_id = $user->id_user;
$this->_login = $user->login;
return true;
} else {
return false;
}
}

public function getId()
{
return $this->_id;
}


Вывожу - <H3>Ваш ID, <?=Yii::app()->user->getId();?>!
Вместо id_user, выводит имя пользователя из таблицы (login). Откуда что берется?!

[guest] Гость

Было сказано: Пятница, 26 Февраль 2010

<?=Yii::app()->user->id;?>

надо.

[guest] Гость

Было сказано: Понедельник, 12 Апрель 2010

Думаю лучше мню сделать через zii как в оригинале :)

<?php $this->widget('zii.widgets.CMenu',array(
'items'=>array(
array('label'=>'Главная', 'url'=>array('/post/index')),
array('label'=>'Вход', 'url'=>array('/user/login'), 'visible'=>Yii::app()->user->isGuest),
array('label'=>'Регистрация', 'url'=>array('/user/registration'), 'visible'=>Yii::app()->user->isGuest),
array('label'=>'Выход ('.Yii::app()->user->name.')', 'url'=>array('/user/logout'), 'visible'=>!Yii::app()->user->isGuest)
),
)); ?>

[adm] zolter

Было сказано: Понедельник, 12 Апрель 2010

Конечно! Просто статья писалась когда был yii 1.0.x, и zii тогда не существовало :)

[guest] Гость

Было сказано: Пятница, 23 Апрель 2010

Статья замечательная! А подскажите, как и где пароль можно через md5 пропустить, чтобы в базу открытые пароли не писать.

[guest] Гость

Было сказано: Пятница, 23 Апрель 2010

Кажеься понял
$form->passWD = md5($_POST['User']['passWD']);
Может есть что поинтереснее?

И еще вопрос, как записать текущую дату? - внедрить NOW()

[adm] zolter

Было сказано: Пятница, 23 Апрель 2010

Спасибо за хороший отзыв! :)

По поводу шифрования пароля - совершенно верно, md5 будет вполне достаточно. Можете делать двойной md5. Если используете md5 не забудьте тогда еще в UserIdentity сделать:

else if($record->passwd!==md5($this->password))


По поводу NOW() делайте вот так:
$form->peremenaia_vremeni = new CDbExpression('NOW()');

NickSun

Было сказано: Пятница, 30 Апрель 2010

Как быть в такой ситуации:
На каждой странице сайта есть форма авторизации которая появляется при нажатии на кнопку (т.е. чтоб авторизоваться переходить на другую страницу не нужно). И собственно вопрос: где и как нужно создать модель формы, чтобы она успешно отрисовалась не зависимо от нашего местоположения на сайте (т.е. не зависимо от экшина и контроллера).

[guest] zolter

Было сказано: Суббота, 01 Май 2010

Очень просто. Для формы авторизации создаете отдельный виджет. А уже в лаяуте делаете его вывод. И получится что на каждой странице за которую отвечает лаяут - будет ваша форма авторизации

NickSun

Было сказано: Суббота, 01 Май 2010

Спасибо, виджет как раз то что нужно! А этот редирект $this->redirect(Yii::app()->user->returnUrl); вернет на страницу с которой авторизовались?

[guest] Гость

Было сказано: Пятница, 07 Май 2010

что за странное поле в таблице User "Salt" в стандартном демо блоге, для чего оно, и какую роль оно играет? Спасибо!

[guest] Гость

Было сказано: Суббота, 08 Май 2010

Насколько я уже понял читая доки что поле Salt это слово(секрет) которое в перемешку с паролем зашифруеться в md5 чтоб эще больше сделать безопасным пароль, прав ли я? вы я так понял в своем примере реестрации не расматривали такой шифровки

[guest] Гость

Было сказано: Суббота, 08 Май 2010

В моем примере для упрощения шифрование не используется.

[guest] Jay

Было сказано: Суббота, 29 Май 2010

Salt - как правило случайное значение, которое используется для подмешивания в пароль и может храниться где-то в базе (своя salt для каждого пользователя).
Двойное md5 или любое другое двойное хеширование приводит к меньшей криптостойкости. Это связано с увеличением числа коллизий, то есть когда хеш может быть одинаковым для разных исходных данных.

[guest] Гость

Было сказано: Четверг, 12 Август 2010

у меня не получается сделать ни регистрацию, ни авторизацию. какие-то проблемы с валидацией. только я не могу понять что не так. подскажите пожалуйста. выводится такая ошибка:
preg_match(): Compilation failed: invalid UTF-8 string at offset 12
ошибка одинаковая для регистрации и авторизации.

[guest] Гость

Было сказано: Четверг, 12 Август 2010

вот еще что пишет:
Source File

C:\work\yii\framework\validators\CRegularExpressionValidator.php(44)
00032: * Validates the attribute of the object.
00033: * If there is any error, the error message is added to the object.
00034: * @param CModel the object being validated
00035: * @param string the attribute being validated
00036: */
00037: protected function validateAttribute($object,$attribute)
00038: {
00039: $value=$object->$attribute;
00040: if($this->allowEmpty && $this->isEmpty($value))
00041: return;
00042: if($this->pattern===null)
00043: throw new CException(Yii::t('yii','The "pattern" property must be specified with a valid regular expression.'));
00044: if(!preg_match($this->pattern,$value))
00045: {
00046: $message=$this->message!==null?$this->message:Yii::t('yii','{attribute} is invalid.');
00047: $this->addError($object,$attribute,$message);
00048: }
00049: }
00050: }
00051:

[guest] zolter

Было сказано: Пятница, 13 Август 2010

Удалите в rules тогда проверку на допустимые символы в логине:

array('login', 'match', 'pattern' => '/^[A-Za-z0-9А-Яа-я\s,]+$/u','message' => 'Логин содержит недопустимые символы.'),

[guest] Гость

Было сказано: Пятница, 13 Август 2010

спасибо=) помогло. авторизация теперь работает, а вот регистрация нет. переходит на страницу успешной регистрации, но в таблицу в бд ничего не записывает.

[guest] Илья

Было сказано: Вторник, 23 Ноябрь 2010

думаю, стоит сделать статьи для новой версии фреймворка, а то разбираться почему не работает как то не хочется. Тем более CForm используется не так, как рекомендует разработчик

vlad

Было сказано: Пятница, 28 Январь 2011

Автор, спасибо за статью, только есть одна просьба :
выложите дамп БД, или покажите ссылку, если она была ранее представлена.
Спасибо.

[guest] Гость

Было сказано: Понедельник, 04 Июль 2011

session_regenerate_id() [<a href='function.session-regenerate-id'>function.session-regenerate-id</a>]: Cannot regenerate session id - headers already sent

An internal error occurred while the Web server was processing your request. Please contact the webmaster to report this problem.

Thank you.

вот что выдает если ввести правельные логгин и пароль при регистрации.

[guest] TranceSmile

Было сказано: Четверг, 18 Август 2011

Может быть у тебя файлы сохранены в UTF-8, а должны быть utf-8 without BOM

[guest] Гость

Было сказано: Вторник, 11 Октябрь 2011

Блин! Замучился разбираться уже...
Проблема: после валидации по правилу array('password', 'compare', 'compareAttribute'=>'password2', 'on'=>'registration') (у меня именно 'password' и 'password2') объект $form становиться девственно чистым и не обременённым какими-либо данными.

password2 - публичный атрибут, в который, почему-то не пишется значение формы повторения пароля password2 в момент присвоения $form->attributes = $_POST['Users'], приходиться делать $form->password2 = $_POST['Users']['password2']. Хотя в safeAttributes password2 присутствует.

В шоке от документации к фрейм-ворку. Даже на данной статье (которая не подходит к текущей версии) учиться гораздо проще)...

[guest] Maxx

Было сказано: Вторник, 11 Октябрь 2011

Попробуй делать проверку двух полей как автор этой статьи, через отдельный метод проверки. У меня compareAttribute в свое время тоже не хотел проверять, а мне было лень разбератся. Поэтому тоже испльзовал отдельный метод.

[guest] Гость

Было сказано: Суббота, 22 Октябрь 2011

Блин. Всё делаю по порядку, но не получается пройти авторизацию. При вводе любого логина и правильной капче выбрасывает на главную. Если ввести не правильную капчу, то выдает ошибку. На логины и пароли вообще внимание не обращает при авторизации.
Скачал Ваш архив тоже самое.

[guest] Гость

Было сказано: Суббота, 22 Октябрь 2011

Решилось как-то так:
В User.php заменил
array('passwd', 'authenticate', 'on' => 'login')
на
array('passwd', 'authenticate')
теперь всё ок.
Я так понял, что это разница в версиях. Может стоит указать в скобках что нужно изменить если у вас 1.1.
Спасибо за статьи.

[guest] yakoval

Было сказано: Четверг, 24 Ноябрь 2011

Насчет safeAttributes(): как понял, эта функция называется getSafeAttributeNames(). Была аналогичная проблема с пустотой поля passwd2, когда изменил имя функции все заработало.

[guest] Гламурная птица

Было сказано: Воскресенье, 01 Январь 2012

Добрый день.

У сеня почемуто не получается содать поле password2. Я пишу: CHtml::activePasswordField($form, 'password2'), а при загрузке сраниы вылетает ошибка: "Не определено свойство "User.password2"."
Я его в safeAttributes записал. Не подскажите, в чем проблемма?

Оставить комментарий


Код:
Имя: