0

我正在尝试在 Laravel4 项目中进行身份验证,但它总是失败。

因为我只使用 PHP 5.3.4,所以我从https://github.com/robclancy/laravel4-hashing下载了一个使用 SHA512 的替换 Hash 包。

我已经有一个用户表(密码字段预先填充了 SHA512 哈希,与另一个应用程序共享),我的登录验证方法是:

Route::post('login', function()
{
    $userdata = array(
                'UserName' => 'SteB', 
                'password' => '1234'
                );

    if (Auth::attempt($userdata, true))
    {
       return Redirect::action('HomeController@Profile');
    }                    
    else
    {
        return Redirect::to('/')->with('login_errors', true);
    }

});

我还使用http://hash.online-convert.com/sha512-generator检查了 SHA512 哈希是否正确

这总是失败(默默地),任何为什么或如何调试它的想法都将不胜感激。

我的用户表是:

UserID int, Identity PK
UserName varchar(24)
FullName varchar(32)
EMail varchar(64)
Password varchar(256)

这是在现有的 SQL Server 2000 数据库中,我正在从数据库中获取未经身份验证的页面的用户信息,所以我知道数据库驱动程序和连接工作正常。

Laravel 中的用户模型:

use Illuminate\Auth\UserInterface;
use Illuminate\Auth\Reminders\RemindableInterface;

class User extends Eloquent implements UserInterface, RemindableInterface 
{

/**
 * The database table used by the model.
 *
 * @var string
 */
protected $table = 'Users';

/**
 * The attributes excluded from the model's JSON form.
 *
 * @var array
 */
protected $hidden = array('password');

//protected $fillable = array('UserID', 'UserName', 'FullName');

/**
 * Get the unique identifier for the user.
 *
 * @return mixed
 */
public function getAuthIdentifier()
{
    return $this->getKey();
}

/**
 * Get the password for the user.
 *
 * @return string
 */
public function getAuthPassword()
{
            /*Now all lowercase to match $userdata as suggested on SO*/
    return $this->password;
}

/**
 * Get the e-mail address where password reminders are sent.
 *
 * @return string
 */
public function getReminderEmail()
{
    return $this->EMail;
}
}

更新:

刚刚找到这篇文章: http: //laravel.io/topic/20/hashing-in-laravel
看起来它没有按照我的预期做事,我认为这是一个带有随机盐的 base64 编码哈希。

4

3 回答 3

2

因此,您需要更改模型中的某些内容以及传递给尝试的密钥

class User extends Eloquent implements UserInterface
{
    public function getAuthPassword()
    {
        return $this->Password;
    }

    // leave other code the same
 }

在您的数组中,您通过更改它,如下所示。

$userdata = array( 'UserName' => 'SteB', 'password' => '1234');

getAuthPassword() 告诉 Auth 库您的实际字段名,并将 userdata 中的键设置为全小写password告诉 Auth 库散列该字段。

于 2013-07-14T16:22:19.923 回答
0

编辑:你可以尝试所有这些等等,但我想我在写完这篇文章后就证明自己错了。

我相信这个问题与您的数据库列命名和 Laravel 中的限制有关。查看 Laravel 的 auth 组件,我发现了一些它特别想要的区域,password或者至少是包含该确切短语的字符串。所以你的数据库需要使用password列或者你需要扩展 laravel 来改变一些东西。

老实说,你应该只在 laravel 中使用骆驼箱或蛇箱。当您使用它从未预料到的东西时,可能会出现像这样的问题,因为没有合乎逻辑的理由使用其他任何东西。

很容易修复,使用更好的列名。

更难的修复是扩展 Auth 组件以允许您的Password字段。

于 2013-07-14T16:11:11.587 回答
0

我不知道您的数据库结构是什么样的,但是您的用户名键可能与您的数据库列不同吗?

也许这会起作用:

$userdata = array(
    'username' => 'SteB', 
    'password' => '1234'
);

干杯。

于 2013-07-14T15:12:26.067 回答