2013-08-18 3 views
1

Мне нужно хеш и сохранить пароль с пользовательского ввода в форме входа в Yii. Если я получаю их через параметры POST, как это:Получение имени пользователя и пароля в параметрах POST при создании нового пользователя

$model->username=$_POST['User']['username']; 
$model->password=crypt($_POST['User']['username']);// salt might be added 
if($model->save()) 
    $this->redirect(array('view','id'=>$model->id)); 

этот путь я разоблачить uncrypted пароль в запросе POST. Другого пути к ним непосредственно от входа в форме, как это:

public function actionCreate2() 
{ 
    $model=new User; 
    $model->username = $form->username; 
    $model->password = crypt($form->password); 
    if($model->save()) 
      $this->redirect(array('view','id'=>$model->id)); 

    $this->render('create',array(
     'model'=>$model, 
    )); 
} 

но не работает в моем случае с аутентификацией сохраненного пользователя. Функция аутентификации:

public function authenticate() 
{ 
    $users = User::model()->findByAttributes(array('username'=>$this->username)); 

    if($users == null) 
     $this->errorCode=self::ERROR_USERNAME_INVALID; 
    elseif ($users->password !== crypt($this->password, $users->password)) 
    //elseif($users->password !== $this->password) 
     $this->errorCode=self::ERROR_PASSWORD_INVALID; 
    else 
     $this->errorCode=self::ERROR_NONE; 
    return !$this->errorCode; 
} 

Как сделать это надлежащим образом?

Чем больше неприятностей появились как я последовал предложить Самуил - сообщение проверяющих сигнализаций еще до того, я ничего вводить вместе с хэшированном паролем в поле ввода (см рисунка):. more trouble

Когда я еще ввести мой имя пользователя и мой пароль вместо «предложенного» и нажмите кнопку «Создать» форма посылается с не зашифрованной значения (от запроса POST нюхает):

Form Data view source view URL encoded 
YII_CSRF_TOKEN:9758c50299b9d4b96b6ac6a2e5f0c939eae46abe 
User[username]:igor23 
User[password]:igor23 
yt0:Create 

но ничего на самом деле хранится в БД, ни шифрованных не uncrypted. ..

+0

Какую ошибку вы получили? Вы пытались сбросить склепу пароля сохраненного пользователя с помощью склепа passowrod из формы входа? –

+0

В 'authenticate' вы передаете хешированный пароль как соль, а при сохранении не пропускается соль, следовательно, ошибка. – topher

ответ

1

Измените метод создания на:

/** 
* Creates a new model. 
* If creation is successful, the browser will be redirected to the 'view' page. 
*/ 
public function actionCreate() { 
    $model = new User; 

    if (isset($_POST['User'])) { 
     $model->attributes = $_POST['User']; 
     $model->password = crypt($model->password, 'mysalt123'); 

     if ($model->save()) 
      $this->redirect(array('view', 'id' => $model->primaryKey)); 
    } 

    // Reset password field 
    $model->password = ""; 

    $this->render('create', array(
     'model' => $model, 
    )); 
} 

изменения, которые ELSEIF из этого:

elseif ($users->password !== crypt($this->password, $users->password)) 

Для этого:

elseif (strcmp(crypt($this->password, 'mysalt123'), $users->password)) 
+0

Я следил за вашим предложением, но не помогло. скорее теперь я с самого начала сигнализировал о поле * Имя * для заполнения и значение хэшированного пароля в области ввода формы. Посмотрите картинку в конце вопроса. –

+0

Разве это не для метода аутентификации? Как это влияет на создание метода вообще? И почему у нового пользователя есть значение по умолчанию в поле пароля, даже до того, как пользователь что-либо ввел? –

+0

Это для аутентификации, правда. Но, похоже, действие контроллера получает пустое значение из формы, шифрует его и помещает в поле ввода ввода пароля для моей проблемы. Также я не хочу, чтобы сообщения проверки были от начала, перед любым вводом. –