如何更改/自定义密码字段名称为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函数,如validate
或once
),如果你这样做:
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"; });
- 创build空的数据库,并在
app/config/database.php
设置连接数据 - 现在你可以运行
/db
url例如http://localhost/yourprojectname/db
来创build用户表。 - 现在你可以运行
/
url例如http://localhost/yourprojectname/
– 就像你看到的用户login一样,即使在users
数据库表中你没有任何password
列(authentication数据已经作为string传递了,没有任何forms,但当然在实际应用中,您将添加它们)。 您可以再次运行此url – 因为您看到用户仍然处于login状态,所以它按预期工作。 - 如果您点击
Log out
链接,您将被注销
上面的Laravel 5改变了
这个解决scheme已经在Larave 4.2.9(上面的所有内容)以及Laravel 5中进行了testing。在Laravel5中,所有工作都是相同的,但是您需要编辑不同path的文件:
-
User
模型在app/User.php
文件中 - path在
app/Http/routes.php
文件中 - 数据库configuration文件在
config/database.php
文件中