我正在尝试将Laravel连接到外部数据库以进行身份验证,但我不知道该怎么做。
如何扩展Laravels身份验证以允许自定义登录方法?
数据库为auth
,并使用username
或email
登录,密码哈希为sha512。
最好的方法是什么?
答案 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;
});
}
}