基于 laravel 默认的 auth
实现 api 认证
现在微服务越来越流行了. 很多东西都拆分成独立的系统,各个系统之间没有直接的关系. 这样我们如果做用户认证肯定是统一的做一个独立的 用户认证
系统,而不是每个业务系统都要重新去写一遍用户认证相关的东西. 但是又遇到一个问题了. laravel
默认的auth 认证
是基于数据库做的,如果要微服务架构可怎么做呢?
实现代码如下:
UserProvider 接口:
\/\/ 通过唯一标示符获取认证模型
public function retrieveById($identifier);
\/\/ 通过唯一标示符和 remember token 获取模型
public function retrieveByToken($identifier, $token);
\/\/ 通过给定的认证模型更新 remember token
public function updateRememberToken(Authenticatable $user, $token);
\/\/ 通过给定的凭证获取用户,比如 email 或用户名等等
public function retrieveByCredentials(array $credentials);
\/\/ 认证给定的用户和给定的凭证是否符合
public function validateCredentials(Authenticatable $user, array $credentials);
Laravel
中默认有两个 user provider : DatabaseUserProvider
& EloquentUserProvider
.
DatabaseUserProviderIlluminate\Auth\DatabaseUserProvider
直接通过数据库表来获取认证模型.
EloquentUserProviderIlluminate\Auth\EloquentUserProvider
通过 eloquent 模型来获取认证模型
根据上面的知识,可以知道要自定义一个认证很简单。
自定义 Provider
创建一个自定义的认证模型,实现 Authenticatable 接口;
App\Auth\UserProvider.php
<?php
namespace App\Auth;
use App\Models\User;
use Illuminate\Contracts\Auth\Authenticatable;
use Illuminate\Contracts\Auth\UserProvider as Provider;
class UserProvider implements Provider
{
\/**
* Retrieve a user by their unique identifier.
* @param mixed $identifier
* @return \Illuminate\Contracts\Auth\Authenticatable|null
*\/
public function retrieveById($identifier)
{
return app(User::class)::getUserByGuId($identifier);
}
\/**
* Retrieve a user by their unique identifier and "remember me" token.
* @param mixed $identifier
* @param string $token
* @return \Illuminate\Contracts\Auth\Authenticatable|null
*\/
public function retrieveByToken($identifier, $token)
{
return null;
}
\/**
* Update the "remember me" token for the given user in storage.
* @param \Illuminate\Contracts\Auth\Authenticatable $user
* @param string $token
* @return bool
*\/
public function updateRememberToken(Authenticatable $user, $token)
{
return true;
}
\/**
* Retrieve a user by the given credentials.
* @param array $credentials
* @return \Illuminate\Contracts\Auth\Authenticatable|null
*\/
public function retrieveByCredentials(array $credentials)
{
if ( !isset($credentials['api_token'])) {
return null;
}
return app(User::