如何更改/自定义密码字段名称为Laravel 4和Laravel 5用户身份validation

我想在使用Laravel身份validation时更改数据库中的密码字段。 我想我的列在users表中有名字passwd而不是password 。 我试图运行这样的东西:

 Auth::attempt(array( 'user_name' => 'admin', 'passwd' => 'hardpass', )); 

但它不起作用。

我也尝试在User模型中添加以下function:

 public function getAuthPassword() { return $this->passwd; } 

但它也没有改变。 用户仍然没有被authentication。 在Laravel中可以更改数据库中的密码字段名称吗?

信息

您可以更改数据库中的所有其他字段,并将其用于身份validation。 唯一的问题是password字段。

事实上, password字段在Laravel中以某种方式硬编码(但不是很多人认为的),所以当你传递你的问题时,你不能仅仅传递数组。

默认情况下,如果你传递数组来attempt (也可能是其他Auth函数,如validateonce ),如果你这样做:

 Auth::attempt(array( 'user_name' => 'admin', 'password' => 'hardpass', )); 

默认Eloquent驱动程序将运行以下查询:

 select * from `users` where `user_name` = 'admin' limit 1; 

从数据库获取这个数据之后,它将比较你创build的User对象的密码属性。

但是,如果你只是使用:

 Auth::attempt(array( 'user_name' => 'admin', 'passwd' => 'hardpass', )); 

将运行以下查询:

 select * from `users` where `user_name` = 'admin' and `passwd` = 'hardpass' limit 1; 

并且在数据库中不会find用户(在passwd存储散列的密码)。 这是因为Eloquent从查询password删除,但使用任何其他数据来运行查询。 此外,如果您尝试在这里使用'passwd' => Hash:make($data['password'])虽然用户将被find,但比较密码将不起作用。

解决scheme非常简单。 你需要像这样运行Auth::attempt

 Auth::attempt(array( 'user_name' => 'admin', 'password' => 'hardpass', )); 

正如你所看到的,你仍然通过password作为关键(虽然这个列不会在users表中退出),因为只有这样,雄辩的驱动程序将不会使用它来build立查询。

现在在User模型( app/models/User.php )文件中,您需要添加以下函数:

 public function getAuthPassword() { return $this->passwd; } 

正如你所看到的,你在这里使用了真正存在于数据库中的列: passwd

通过这种方式使用它,你可以有一个名为你想要的密码的列,你仍然可以使用默认的Eloquent驱动程序。

要testing的示例数据

我为它创build了非常简单的testing。

你只需要用下面的代码来replace你的app/routes.php文件:

 Route::get('/', function () { if (Auth::check()) { echo "I'm logged in as " . Auth::user()->user_name . "<br />"; echo "<a href='/logout'>Log out</a>"; } else { echo "I'm NOT logged in<br />"; Auth::attempt(array( 'user_name' => 'admin', 'password' => 'hardpass', )); if (Auth::check()) { echo "Now I'm logged in as " . Auth::user()->user_name . "<br />"; echo "<a href='/logout'>Log out</a>"; } else { echo "I'm still NOT logged in<br />"; } } }); Route::get('/logout', function () { Auth::logout(); return "You have been logged out"; }); Route::get('/db', function () { if (!Schema::hasTable('users')) { Schema::create('users', function ($table) { $table->engine = 'InnoDB'; $table->increments('id'); $table->string('user_name', 60)->unique(); $table->string('passwd', 256); $table->rememberToken(); $table->timestamps(); }); DB::table('users')->insert( [ [ 'user_name' => 'admin', 'passwd' => Hash::make('hardpass'), ] ] ); } echo "Table users has been created"; }); 
  1. 创build空的数据库,并在app/config/database.php设置连接数据
  2. 现在你可以运行/db url例如http://localhost/yourprojectname/db来创build用户表。
  3. 现在你可以运行/ url例如http://localhost/yourprojectname/ – 就像你看到的用户login一样,即使在users数据库表中你没有任何password列(authentication数据已经作为string传递了,没有任何forms,但当然在实际应用中,您将添加它们)。 您可以再次运行此url – 因为您看到用户仍然处于login状态,所以它按预期工作。
  4. 如果您点击Log out链接,您将被注销

上面的Laravel 5改变了

这个解决scheme已经在Larave 4.2.9(上面的所有内容)以及Laravel 5中进行了testing。在Laravel5中,所有工作都是相同的,但是您需要编辑不同path的文件:

  1. User模型在app/User.php文件中
  2. path在app/Http/routes.php文件中
  3. 数据库configuration文件在config/database.php文件中