laravel 4 auth ::尝试以明文形式输入密码

时间:2013-05-28 13:27:52

标签: php laravel laravel-4

如何告诉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';
    }

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

1 个答案:

答案 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的其他接口实现位于同一位置。