2012-05-03 22 views
0

因此,我嘗試登錄Yii的應用程序,似乎停止在他們的驗證或我的站點控制器的登錄功能。它永遠不會登錄它從來沒有任何有用的東西。沒有顯示器,沒有錯誤,虛無縹緲拉鍊Yii:用戶認證不工作

我是以下幾點:http://www.larryullman.com/2010/01/04/simple-authentication-with-the-yii-framework/

UserIdentity類:

class UserIdentity extends CUserIdentity 

public function authenticate() 
{ 

     $user = User::model()->findByAttributes(array('username'=>$this->username)); 
     $saltedPW = ""; // null string for salted PW 

     if ($user===null) { // No user found! 
       $this->errorCode=self::ERROR_USERNAME_INVALID; 
     } 

     if ($user!==null){ 
      // salt the user password string then hash 
      // incase $user pw is not a salted hash, rather a password string 
      $saltedPW = md5(Yii::app()->params["salt"] . $user->password); 

      //testing the password 
      if (($user->password !== $this->password) || 
       ($saltedPW  !== $this->password)) 
      { 
        $this->errorCode=self::ERROR_PASSWORD_INVALID; 
      } 
      else 
      { 
        $this->errorCode=self::ERROR_NONE; 
      } 
     } 
    return !$this->errorCode; 
    } 

}從現場控制器

登錄:

public function actionLogin() 
{ 
    $model=new LoginForm; 

    // if it is ajax validation request 
    if(isset($_POST['ajax']) && $_POST['ajax']==='login-form') 
    { 
     echo CActiveForm::validate($model); 
     Yii::app()->end(); 
    } 

    // collect user input data 
    if(isset($_POST['LoginForm'])) 
    { 
     $model->attributes=$_POST['LoginForm']; 
     // validate user input and redirect to the previous page if valid 
     if($model->validate() && $model->login()) 
        { 
         $this->redirect(Yii::app()->user->returnUrl); 
        } 
        else 
        { 
         $this->render('login',array('model'=>$model)); 
        } 
    } 
    // display the login form 
    $this->render('login',array('model'=>$model)); 
} 

登錄形式

class LoginForm extends CFormModel 
{ 
    public $username; 
    public $password; 
    public $rememberMe; 
    private $_identity; 

    /** 
    * Declares the validation rules. 
    * The rules state that username and password are required, 
    * and password needs to be authenticated. 
    */ 
    public function rules() 
    { 
     return array(
      // username and password are required 
      array('username, password', 'required'), 
      // rememberMe needs to be a boolean 
      array('rememberMe', 'boolean'), 
      // password needs to be authenticated 
      array('password', 'authenticate'), 
     ); 
    } 

    /** 
    * Declares attribute labels. 
    */ 
    public function attributeLabels() 
    { 
     return array(
      'rememberMe'=>'Remember me next time', 
     ); 
    } 

    /** 
    * Authenticates the password. 
    * This is the 'authenticate' validator as declared in rules(). 
    */ 
    public function authenticate($attribute,$params) 
    { 
     if(!$this->hasErrors()) 
     { 
      $this->_identity=new UserIdentity($this->username,$this->password); 
      if(!$this->_identity->authenticate()) 
       $this->addError('password','Incorrect username or password.'); 
     } 
    } 

    /** 
    * Logs in the user using the given username and password in the model. 
    * @return boolean whether login is successful 
    */ 
    public function login() 
    { 
     if($this->_identity===null) 
     { 
      $this->_identity=new UserIdentity($this->username,$this->password); 
      $this->_identity->authenticate(); 
     } 
     if($this->_identity->errorCode===UserIdentity::ERROR_NONE) 
     { 
      $duration=$this->rememberMe ? 3600*24*30 : 0; // 30 days 
      Yii::app()->user->login($this->_identity,$duration); 
      return true; 
     } 
     else 
      return false; 
    } 

} 
+0

1)眼看視圖代碼可以幫助 - 它可能是缺少邏輯打印錯誤,或者輸入字段可能名不副實...... 2)的方式你正在驗證密碼是一團糟。正如我所看到的,您期望數據庫中的用戶記錄包含純文本密碼,並且如果用戶輸入相同的純文本或其鹽分版本,將會接受它?你應該以相反的方式 - db爲每個用戶包含hash和salt,登錄例程用用戶的salt將''strcmp'散列輸入的密碼。 3)獲取[xdebug](http://xdebug.org/),體面的調試非常有幫助。 – DCoder

+2

根據我的經驗,如果沒有(引號:「沒有顯示,沒有錯誤,nada zip」)出現在瀏覽器窗口中,原因通常是PHP錯誤。你有沒有看看Web服務器錯誤日誌? – jmclem

回答

1

我剛剛用這個和它的工作替換了UserIdentity類。

保護/組件/ UserIdentity.php

<?php 

/** 
* UserIdentity represents the data needed to identity a user. 
* It contains the authentication method that checks if the provided 
* data can identity the user. 
*/ 
class UserIdentity extends CUserIdentity { 

    /** 
    * Id for current user. 
    * @var type 
    */ 
    private $_id; 

    /** 
    * Email address variable. 
    * @var type 
    */ 
    public $email; 

    /** 
    * Custom error indicators. 
    */ 

    const ERROR_EMAIL_INVALID = 3; 
    const ERROR_ACCOUNT_INACTIVE = 4; 

    /** 
    * Over-ride the parent constructor and uses email for auth. 
    * @param type $email 
    * @param type $password 
    */ 
    public function __construct($email, $password) { 
     $this->email = $email; 
     $this->username = $email; 
     $this->password = $password; 
    } 

    public function authenticate() { 
     // we need to filter on email only 
     $attrs = array('email' => $this->email); 
     // obtain all users matching this criterion 
     $record = User::model()->findByAttributes($attrs); 
     // if no users are obtained, we need to set custom message. 
     if ($record === null) 
      $this->errorCode = self::ERROR_EMAIL_INVALID; 
     // if password does not match, indicate this via message. 
     else if ($record->password !== crypt($this->password, $record->password)) 
      $this->errorCode = self::ERROR_PASSWORD_INVALID; 
     // check if user account is enabled. 
     else if ($record->is_authorised == 0) 
      $this->errorCode = self::ERROR_ACCOUNT_INACTIVE; 
     else { 
      // all check passed, now initiate a whatevr. 
      $this->_id = $record->id; 
      $this->email = $this->username = $record->email; 
      // no error occurred. 
      $this->errorCode = self::ERROR_NONE; 
     } 
     // return the errorCode. 
     return $this->errorCode; 
    } 

    /** 
    * Returns ID. 
    * @return type 
    */ 
    public function getId() { 
     return $this->_id; 
    } 

    /** 
    * Returns username, part before '@' sign. 
    * @return type 
    */ 
    public function getName() { 
     $usernameParts = explode('@', $this->email); 
     return $usernameParts[0]; 
    } 

}