如何告诉laravel auth::attempt
密码字段是以纯文本形式存储的,而不是假设它是经过哈希处理的?
with-in the guard.php
public function attempt(array $credentials = array(), $remember = false, $login = true)
{
$this->fireAttemptEvent($credentials, $remember, $login);
$user = $this->provider->retrieveByCredentials($credentials);
// If an implementation of UserInterface was returned, we'll ask the provider
// to validate the user against the given credentials, and if they are in
// fact valid we'll log the users into the application and return true.
if ($user instanceof UserInterface)
{
if ($this->provider->validateCredentials($user, $credentials))
{
if ($login) $this->login($user, $remember);
return true;
}
}
return false;
}
或更好,但我只有2列,一列作为明文,另一列作为password_secured。
如果我尝试后者,如何判断密码列名称是password_secured.
Cuz我试过这个,并收到错误Undefined index: password
。
$user = array(
'user_id' => Input::get('username'),
'password_secured' => Input::get('password'),
'checklogin' => 0,
);
if (Auth::attempt($user)) {
return 'login success';
}
问题是我正在移植应用程序,而不是从头开始构建,我真的需要将密码存储在纯文本中,因为另一个应用程序正在使用数据库(它是实时的)并且被编码为读取密码明文。
答案 0 :(得分:4)
考虑运行脚本来散列所有密码:明文存储应永远不强制执行或甚至考虑(即使您继承了系统),因为这些密码是在您的数据库内容泄露的那一刻立即丢失。黑客发生了。想象一下,如果您的客户发现您没有按照标准处理他们的数据,就会提起诉讼....
现在,假设你不想留意这个警告,那么做到这一点的方法是非常hackish但是有效。从来源(查找Guard
)中可以看到__construct
,其中包含一个实现UserProviderInterface
的对象。
你有很多合适的对象。选择你想要的,并扩展它。我们会对DatabaseUserProvider
有一些乐趣,虽然这种扩展方法对所有这些方法都很方便且可行。
我们要扩展的方法是public function validateCredentials(UserInterface $user, array $credentials)
。如下:
namespace Illuminate\Auth;
class MyUserInterface extends DatabaseUserProvider {
public function validateCredentials(UserInterface $user, array $credentials) {
$plain = $credentials['password'];
return ($plain === $user->getAuthPassword());
}
}
当MyUserInterface
扩展DatabaseUserProvider
本身提供UserProviderInterface
时,MyUserInterface
现在在Guard
中作为提供者可依赖注入。我们完成了一半的工作。下一步是实际告诉Guard加载你的东西。我不熟悉Laravel4加载Guard
实现的方式,但在某个地方的某个地方,你可以将MyUserInterface
设置为选择的Guard接口。我不能比这更具体。
顺便说一下,该类需要与Auth
的其他接口实现位于同一位置。