2012-08-06 188 views
0

我想用戶Kohana的身份驗證模塊,但我得到的錯誤: '調用未定義的方法Model_User :: unique_key()'Kohana的身份驗證登錄

我的用戶代碼:

$auth = Auth::instance(); 
    if ($auth->login($_POST['email'], $_POST['password'])) 
    { 
     echo 'hello, '.$auth->$_POST['username']; 
    } 
    else 
    { 
     echo 'login failed!'; 
    } 

這發生在電子郵件和密碼正常時。 你知道什麼是錯的嗎?

回答

2

您收到的錯誤似乎是因爲您沒有用於身份驗證的配置文件設置。你應該有一個位於/application/config/auth.php的文件。這裏是我的例子:

<?php defined('SYSPATH') or die('No direct access allowed.'); 

return array(

    'driver'  => 'ORM', 
    'hash_method' => 'sha256', 
    'hash_key'  => 'Somebiglonghaskeyofmixedcharacters102345567709', 
    'lifetime'  => 1209600, 
    'session_type' => Session::$default, 
    'session_key' => 'auth_user', 

    // Username/password combinations for the Auth File driver 
    'users' => array(
     // 'admin' => 'b3154acf3a344170077d11bdb5fff31532f679a1919e716a02', 
    ), 
); 

我的配置文件導致auth使用數據庫來存儲用戶。請參閱有關如何設置數據庫的文檔,或者您可以使用文件身份驗證。

一旦你得到你的配置工作,您可以登錄這樣的用戶:

$user = Auth::instance()->login($this->request->post('username'), $this->request->post('password'), $remember); 

我也覺得很有用創建應用程序/類/模型/ user.php的我自己的用戶模型。下面是我的一個例子:

<?php defined('SYSPATH') or die('No direct access allowed.'); 
class Model_User extends ORM { 

/** 
* A user has many tokens and roles 
* 
* @var array Relationhips 
*/ 
protected $_has_many = array(
    'user_tokens' => array('model' => 'user_token'), 
    'roles'  => array('model' => 'role', 'through' => 'roles_users'), 
); 

/** 
* Rules for the user model. Because the password is _always_ a hash 
* when it's set,you need to run an additional not_empty rule in your controller 
* to make sure you didn't hash an empty string. The password rules 
* should be enforced outside the model or with a model helper method. 
* 
* @return array Rules 
*/ 
public function rules() 
{ 
    return array(
     'username' => array(
      array('not_empty'), 
      array('max_length', array(':value', 32)), 
      array(array($this, 'unique'), array('username', ':value')), 
      array('regex', array(':value', '/^[a-z][a-z0-9]+$/i')), 
     ), 
     'email' => array(
      array('not_empty'), 
      array('email'), 
      array(array($this, 'unique'), array('email', ':value')), 
     ), 
    ); 
} 

/** 
* Filters to run when data is set in this model. The password filter 
* automatically hashes the password when it's set in the model. 
* 
* @return array Filters 
*/ 
public function filters() 
{ 
    return array(
     'password' => array(
      array(array(Auth::instance(), 'hash')) 
     ) 
    ); 
} 

/** 
* Labels for fields in this model 
* 
* @return array Labels 
*/ 
public function labels() 
{ 
    return array(); 
} 

/** 
* Complete the login for a user by incrementing the logins and saving login timestamp 
* 
* @return void 
*/ 
public function complete_login() 
{ 
    if ($this->_loaded) 
    { 
     // Update the number of logins 
     $this->logins = new Database_Expression('logins + 1'); 

     // Set the last login date 
     $this->last_login = time(); 

     // Save the user 
     $this->update(); 
    } 
} 

/** 
* Tests if a unique key value exists in the database. 
* 
* @param mixed the value to test 
* @param string field name 
* @return boolean 
*/ 
public function unique_key_exists($value, $field = NULL) 
{ 
    if ($field === NULL) 
    { 
     // Automatically determine field by looking at the value 
     $field = $this->unique_key($value); 
    } 

    return (bool) DB::select(array('COUNT("*")', 'total_count')) 
     ->from($this->_table_name) 
     ->where($field, '=', $value) 
     ->where($this->_primary_key, '!=', $this->pk()) 
     ->execute($this->_db) 
     ->get('total_count'); 
} 

/** 
* Allows a model use both email and username as unique identifiers for login 
* 
* @param string unique value 
* @return string field name 
*/ 
public function unique_key($value) 
{ 
    return Valid::email($value) ? 'email' : 'username'; 
} 

/** 
* Password validation for plain passwords. 
* 
* @param array $values 
* @return Validation 
*/ 
public static function get_password_validation($values) 
{ 
    return Validation::factory($values) 
     ->rule('password', 'min_length', array(':value', 8)) 
     ->rule('password_confirm', 'not_empty') 
     ->rule('password_confirm', 'min_length', array(':value', 8)) 
     ->rule('password_confirm', 'matches', array(':validation', 'password', ':field')); 
} 

/** 
* Create a new user 
* 
* Example usage: 
* ~~~ 
* $user = ORM::factory('user')->create_user($_POST, array(
* 'username', 
* 'password', 
* 'email', 
*); 
* ~~~ 
* 
* @param array $values 
* @param array $expected 
* @throws ORM_Validation_Exception 
*/ 
public function create_user($values, $expected) 
{ 
    // Validation for passwords 
    $extra_validation = Model_User::get_password_validation($values) 
     ->rule('password', 'not_empty'); 

    return $this->values($values, $expected)->create($extra_validation); 
} 

/** 
* Update an existing user 
* 
* [!!] We make the assumption that if a user does not supply a password, that they do not wish to update their password. 
* 
* Example usage: 
* ~~~ 
* $user = ORM::factory('user') 
* ->where('username', '=', 'kiall') 
* ->find() 
* ->update_user($_POST, array(
*  'username', 
*  'password', 
*  'email', 
* ); 
* ~~~ 
* 
* @param array $values 
* @param array $expected 
* @throws ORM_Validation_Exception 
*/ 
public function update_user($values, $expected = NULL) 
{ 
    if (empty($values['password'])) 
    { 
     unset($values['password'], $values['password_confirm']); 
    } 

    // Validation for passwords 
    $extra_validation = Model_User::get_password_validation($values); 

    return $this->values($values, $expected)->update($extra_validation); 
} 
} // End Auth User Model 
1

我遇到了這個和我的製作模型擴展Model_Auth_User固定它。