扩展laravel 5.2身份验证

时间:2016-05-03 13:24:55

标签: php laravel authentication laravel-5.2

我正在尝试将Laravel连接到外部数据库以进行身份​​验证,但我不知道该怎么做。

如何扩展Laravels身份验证以允许自定义登录方法?

数据库为auth,并使用usernameemail登录,密码哈希为sha512。

最好的方法是什么?

2 个答案:

答案 0 :(得分:3)

不同的数据库:

我想说最好的方法是为特定模型定义一个单独的连接。

因此,在您的database.php配置中,添加其他连接(让我们将其命名为mysql_auth)。

要在模型中使用它,您需要将其作为变量添加到类中:

protected $connection = 'mysql_auth';

现在,默认情况下,模型查询将对该确切连接进行查询。

就像记录一样,要构建迁移,请使用Schema::connection('mysql_auth')->create(...)

不同的散列方法:

原件: 要使用不同的散列函数,您基本上需要使用不同的类作为Hash类。

默认情况下,提供程序中定义的散列在此处完成:Illuminate\Hashing\HashServiceProvider::class。要更改它,您必须创建一个单独的,不同的类作为提供者并更改此行:

$this->app->singleton('hash', function () {
    return new BcryptHasher;
});

现在,这将链接到将执行sha512(或其他任何)哈希的您的哈希类(将实现HasherContract接口)。

总而言之,请查看Illuminate\Hashing\HashServiceProvider,如何注册散列方法以及Illuminate\Hashing\BcryptHasher以了解实现散列所需的方法。

更新:

在提供商中注释掉Illuminate\Hashing\HashServiceProvider::class并添加\App\Providers\NewHashServiceProvider::class之类的内容。现在,我们创建一个新的提供程序(app/Providers)。这应该有效:

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class NewHashServiceProvider extends ServiceProvider
{
    /**
     * Indicates if loading of the provider is deferred.
     *
     * @var bool
     */
    protected $defer = true;

    /**
     * Register the service provider.
     *
     * @return void
     */
    public function register()
    {
        $this->app->singleton('hash', function () {
            return new \App\ShaHasher;
        });
    }

    /**
     * Get the services provided by the provider.
     *
     * @return array
     */
    public function provides()
    {
        return ['hash'];
    }
}

这实际上会返回我们的哈希,我们将在稍后创建。

要实施ShaHasher,请创建一个实现HasherContract的类(就像BcryptHasher一样):

<?php

namespace App;

use RuntimeException;
use Illuminate\Contracts\Hashing\Hasher as HasherContract;

class ShaHasher implements HasherContract
{
    /**
     * Hash the given value.
     *
     * @param  string  $value
     * @param  array   $options
     * @return string
     *
     * @throws \RuntimeException
     */
    public function make($value, array $options = [])
    {
        return hash('sha512',$value);
    }

    /**
     * Check the given plain value against a hash.
     *
     * @param  string  $value
     * @param  string  $hashedValue
     * @param  array   $options
     * @return bool
     */
    public function check($value, $hashedValue, array $options = [])
    {
        if (strlen($hashedValue) === 0) {
            return false;
        }

        return hash('sha512',$value) == $hashedValue
    }

    /**
     * Check if the given hash has been hashed using the given options.
     *
     * @param  string  $hashedValue
     * @param  array   $options
     * @return bool
     */
    public function needsRehash($hashedValue, array $options = [])
    {
        return false;
    }
}

答案 1 :(得分:0)

Sha512的新实现可能会是这样的:

namespace App;

use Illuminate\Contracts\Hashing\Hasher;

class Sha512Hasher implements Hasher
{
    public function make($value, array $options = [])
    {

    }

    public function check($value, $hashedValue, array $options = [])
    {

    }

    public function needsRehash($hashedValue, array $options = [])
    {

    }
}

所以你基本上使用ServiceContract Illuminate\Contracts\Hashing\Hasher

要绑定此项,请使用ServiceProvider

class Sha512ServiceProvider extends ServiceProvider
{
    /**
     * Register bindings in the container.
     *
     * @return void
     */
    public function register()
    {
        $this->app->singleton('hash', function () { 
        return new App\Sha512Hasher; 
    });

    }
}