🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
认证可以用与缓存和 session 功能相同的方法扩展。再一次的,使用我们已经熟悉的 extend 方法: ~~~ ~~~ Auth::extend('riak', function($app) { // 返回 Illuminate\Contracts\Auth\UserProvider 的实现 }); ~~~ ~~~ UserProvider 实现只负责从永久存储系统抓取 Illuminate\Contracts\Auth\Authenticatable 实现,存储系统例如: MySQL 、 Riak ,等等。这两个接口让 Laravel 认证机制无论用户数据如何保存或用什么种类的类来代表它都能继续运作。 让我们来看一下 UserProvider contract : ~~~ ~~~ 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 的 Authenticatable 实现并返回。 retrieveByToken 函数用用户唯一的 $identifier 和保存在 remember_token 字段的「记住我」 $token 来取得用户。跟前面的方法一样,应该返回 Authenticatable 的实现。 updateRememberToken 方法用新的 $token 更新 $user 的 remember_token 字段。新 token 可以是在「记住我」成功地登录时,传入一个新的 token,或当用户注销时传入一个 null。 retrieveByCredentials 方法接收当尝试登录应用程序时,传递到 Auth::attempt 方法的凭证数组。这个方法应该接着「查找」底层使用的永久存储,找到符合凭证的用户。这个方法通常会对 $credentials['username'] 用「 where 」条件查找。 并且应该返回一个 UserInterface 接口的实现。这个方法不应该尝试做任何密码验证或认证。 validateCredentials 方法应该通过比较给定的 $user 与 $credentials 来验证用户。举例来说,这个方法可以比较 $user->getAuthPassword() 字串跟 Hash::make 后的 $credentials['password']。这个方法应该只验证用户的凭证数组并且返回布尔值。 现在我们已经看过 UserProvider 的每个方法,接着来看一下 Authenticatable。记住,提供者应该从 retrieveById 和 retrieveByCredentials 方法返回这个接口的实现: ~~~ ~~~ interface Authenticatable { public function getAuthIdentifier(); public function getAuthPassword(); public function getRememberToken(); public function setRememberToken($value); public function getRememberTokenName(); } ~~~ ~~~ 这个接口很简单。 The getAuthIdentifier 方法应该返回用户的「主键」。在 MySQL 后台,同样,这将会是个自动递增的主键。getAuthPassword 应该返回用户哈希过的密码。这个接口让认证系统可以与任何用户类一起运作,无论你使用什么 ORM 或保存抽象层。默认,Laravel 包含一个实现这个接口的 User 类在 app 文件夹里,所以你可以参考这个类当作实现的例子。 最后,当我们已经实现了 UserProvider,我们准备好用 Auth facade 来注册扩展: ~~~ ~~~ Auth::extend('riak', function($app) { return new RiakUserProvider($app['riak.connection']); }); ~~~ ~~~ 用 extend 方法注册驱动之后,在你的 config/auth.php 配置文件切换到新驱动。