nbsp;the container.
*
* @return void
*/
public function register()
{
//
}
}
正如你在上述例子中所看到的,传递给 extend
方法的闭包回调需要返回 Illuminate\Contracts\Auth\Guard
的实现实例,该接口包含了自定义认证 guard 需要的一些方法。
定义好自己的认证 guard 之后,可以在配置文件的 guards
配置中使用话这个 guard:
'guards' => [
'api' => [
'driver' => 'jwt',
'provider' => 'users',
],
],
8、添加自定义用户提供者
如果你没有使用传统的关系型数据库存储用户信息,则需要使用自己的认证用户提供者来扩展 Laravel。我们使用 Auth 门面上的 provider
方法定义自定义该提供者,在服务提供者调用 provider
方法如下:
<?php
namespace App\Providers;
use Auth;
use App\Extensions\RiakUserProvider;
use Illuminate\Support\ServiceProvider;
class AuthServiceProvider extends ServiceProvider{
/**
* Perform post-registration booting of services.
*
* @return void
*/
public function boot()
{
Auth::provider('riak', function($app,array $config) {
// 返回Illuminate\Contracts\Auth\UserProvider实例...
return new RiakUserProvider($app['riak.connection']);
});
}
/**
* 在容器中注册绑定.
*
* @return void
*/
public function register()
{
//
}
}
通过 provider
方法注册用户提供者后,你可以在配置文件 config/auth.php
中切换到新的用户提供者。首先,在该配置文件定义一个使用新驱动的 providers
数组:
'providers' => [
'users' => [
'driver' => 'riak',
],
],
然后,可以在你的 guards
配置中使用这个提供者:
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
],
UserProvider 契约
Illuminate\Contracts\Auth\UserProvider
实现只负责从持久化存储系统中获取Illuminate\Contracts\Auth\Authenticatable
实现,例如MySQL、Riak等等。这两个接口允许 Laravel 认证机制继续起作用而不管用户数据如何存储或者何种类来展现。
让我们先看看 Illuminate\Contracts\Auth\UserProvider
契约:
<?php
namespace Illuminate\Contracts\Auth;
interface UserProvider {
public function retrieveById($identifier);
public function retrieveByToken($identifier, $token);
public function updateRememberToken(Authenticatable $user, $token);
public function retrieveByCredentials(array $credentials);
public function validateCredentials(Authenticatable $user, array $credentials);
}
retrieveById
方法通常获取一个代表用户的键,例如 MySQL 数据中的自增ID。该方法获取并返回匹配该ID的Authenticatabl
实现。
retrieveByToken
函数通过唯一标识和存储在 remember_token
字段中的“记住我”令牌获取用户。和上一个方法一样,该方法也返回 Authenticatabl
实现。
updateRememberToken
方法使用新的 $token
更新 $user
的 remember_token
字段,新令牌可以是新生成的令牌(在登录是选择“记住我”被成功赋值)或者null(用户退出)。
retrieveByCredentials
方法在尝试登录系统时获取传递给 Auth::attempt
方法的认证信息数组。该方法接下来去底层持久化存储系统查询与认证信息匹配的用户,通常,该方法运行一个带“where”条件($credentials[‘username’]
)的查询。然后该方法返回 UserInterface
的实现。这个方法不做任何密码校验和认证。
validateCredentials
方法比较给定 $user
和$credentials
来认证用户。例如,这个方法比较 $user->getAuthPassword()
字符串和经 Hash::make
处理的 $credentials['