3

您如何告诉laravel auth::attempt密码字段以明文形式存储,而不是假设它是散列的?

在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;
}

或者更好的是我只有两列,一列作为明文,另一列作为密码安全。

如果我尝试后者,我如何告诉尝试密码列名称是password_secured.

因为我试过这个,得到一个错误Undefined index: password

    $user = array(
        'user_id'           => Input::get('username'),
        'password_secured'  => Input::get('password'),
        'checklogin'        => 0,
    );

    if (Auth::attempt($user)) {
        return 'login success';
    }

问题是我正在移植应用程序,而不是从头开始构建,我真的需要以明文形式存储密码,因为另一个应用程序正在使用数据库(并且它是实时的)并且被编码为以明文形式读取密码。

4

1 回答 1

4

考虑运行一个脚本来散列你所有的密码:永远不应该强制甚至考虑以明文存储(即使你继承了系统),因为一旦你的数据库内容被泄露,这些密码就会立即丢失。黑客事件发生。想象一下,如果您的客户发现您没有按照标准处理他们的数据,就会引发诉讼......

现在,假设你不想听这个警告,这样做的方法很老套,但很有效。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扩展,现在作为提供者可以依赖注入。我们已经完成了一半的工作。下一步是实际告诉 Guard 加载你的东西。我不熟悉 Laravel4 加载实现的方式,但是在配置的某个地方,您可以将其设置为选择的 Guard 接口。我不能比这更具体。DatabaseUserProviderUserProviderInterfaceMyUserInterfaceGuardGuardMyUserInterface

顺便说一句,该类需要与其他接口实现位于相同的位置Auth

于 2013-05-28T14:17:07.960 回答