本文旨在记录laravel多模块(多应用OR多端认证方式)
目的:前后分离的原因,认证方式走token形式,模块不同采用不同的认证方式.比如:(1)后台模块采用AdminProvider;(2)客户端采用ClientProvider.采用不同的认证方式达到用户认证的结果,之间互不影响.
业务场景:
- 前后端分离时服务端采用token认证方式达到身份校验的目的
- (1)后台管理系统模块的认证(2)其他端的认证
- 不同的认证服务
实现方法(此处只记录简要,可以先阅读https://learnku.com/laravel/t/27760):
// config/auth.php 下默认的guard
'defaults' => [
'guard' => 'web',
'passwords' => 'users',
],
// 扩展的guard
'guards' => [
'web' => [
'driver' => 'session', // 认证驱动
'provider' => 'client',
],
'admin' => [
'driver' => 'jwt',
'provider' => 'admin',
'hash' => false,
],
'client' => [
'driver' => 'jwt',
'provider' => 'client',
'hash' => false,
],
],
// 各个guard对应的服务
'providers' => [
'admin' => [
'driver' => 'admin_eloquent', // 服务驱动
'model' => App\Common\Entities\Administration::class,
],
'client' => [
'driver' => 'client_eloquent',
'model' => App\Common\Entities\User::class,
],
// 'users' => [
// 'driver' => 'database',
// 'table' => 'users',
// ],
],
从上面这一段代码就已经可以知道多端认证的方式了—-定义不同的guard,分配不同的服务
然后只需要在不同的服务模型中实现对应的认证方法即可

通常需要拿到token之后找到对应的用户,这个时候因为是不同的用户model,可能需要认证的参数也不同,后台可能是账号密码,客户端可能是手机号和验证码,这个时候就需要重写UserProvider类的一些方法

如上图在Auth服务中注册驱动就好
返回对应重写之后的服务
use App\Common\Entities\User;
use Illuminate\Auth\EloquentUserProvider;
use Symfony\Component\HttpKernel\Exception\UnauthorizedHttpException;
use Illuminate\Contracts\Support\Arrayable;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Str;
/**
* 修改认证驱动
*/
class ClientUserProvider extends EloquentUserProvider
{
/**
* Create a new database user provider.
*
* @param \Illuminate\Contracts\Hashing\Hasher $hasher
* @param string $model
* @return void
*/
public function __construct($hasher, $model)
{
parent::__construct($hasher, $model);
}
/**
* Retrieve a user by their unique identifier.
*
* @param mixed $identifier
* @return \Illuminate\Contracts\Auth\Authenticatable|null
*/
public function retrieveById($identifier)
{
// 减少每次认证请求数据库,直接请求缓存
if ($model = User::GetInfo($identifier)) {
if ($model->state == 1) {
throw new UnauthorizedHttpException('jwt-auth');
}
if (!$model->openid) {
throw new UnauthorizedHttpException('jwt-auth');
}
}
return $model;
}
/**
* Retrieve a user by the given credentials.
*
* @param array $credentials
* @return \Illuminate\Contracts\Auth\Authenticatable|null
*/
public function retrieveByCredentials(array $credentials)
{
if (
empty($credentials) ||
(count($credentials) === 1 &&
Str::contains($this->firstCredentialKey($credentials), 'password'))
) {
return;
}
// First we will add each credential element to the query as a where clause.
// Then we can execute the query and, if we found a user, return it in a
// Eloquent User "model" that will be utilized by the Guard instances.
$query = $this->newModelQuery();
foreach ($credentials as $key => $value) {
if (Str::contains($key, 'password')) {
continue;
}
if (is_array($value) || $value instanceof Arrayable) {
$query->whereIn($key, $value);
} else {
$query->where($key, $value);
}
}
if ($model = $query->first()) {
Cache::forget('user:info:' . $model->uid);
if ($model->state == 1) {
throw new UnauthorizedHttpException('jwt-auth', '账号被禁用', null, 1002);
}
}
return $model;
}
}
重点: 在控制器中需要切换当前所使用的guard,直接修改配置,或者其他方式都可以
public function __construct()
{
Config::set('auth.defaults.guard', $this->guard);
}
至此多模块切换不同认证model就实现了,最后一步切换guard是最关键的一点
本文是此站第一篇博文,写起来没有什么头绪.可能看到的朋友会看不懂,但还是希望帮到需要的人,也是为了自身加深记忆,继续学习
打赏作者除非注明,否则均为一颗胡萝卜原创文章,转载必须以链接形式标明本文链接
本文链接:Laravel下多模块的认证


晋ICP备19002190号