- laravel 多用户认证 架构
背景
项目包含若干子站点,不同站点功能各异,但共享底层数据及逻辑。公用同一个Auth 中间件来进行多用户登录。用意是最大限度利用 Laravel 自带的认证系统。不过默认的认证都是根据 『email』和『password』字段进行的。之后有时间可能再追加自定义字段比如『phone』的改造方案。
具体方案
项目按照不同站点组织成不同模块,在 Laravel 原有目录结构基础内,分别给各个站点创设目录。
laravel 5.5 project
├── app
│ └── Http
│ └── Controllers
│ ├── Admin 后台目录
│ │ ├── IndexController
│ │ └── LoginController
│ ├── Home 前台目录
│ │ └── IndexController
│ └── Auth laravel自带的认证目录
└── resources
└── views
├── admin
├── auth
└── home
复制代码
本文以 Admin 为例进行说明,如需增加其他站点,进行类似改动即可。
上面的目录是我们最终的目录 其中 Auth 目录 是通过 命令生成:
php artisan make:auth
复制代码
运行命令以后就会生成一套权限系统, 然后 打开路由(web.php) 文件 会看到:
Auth::routes();
Route::get('/home','HomeController@index')->middleware('auth');
复制代码
访问 项目 /home 则会跳转到 登录
接下来 我们 把这个路由改造一下, 首先改造路由:
Auth::routes();
Route::get('/','Home\IndexController@index')->middleware('auth');
复制代码
系统默认的是使用 emial 登录的 ,如果需要使用用户名登录 则 需要打开 :
上面所提到的Controller 下 Auth 目录中的 LoginController.php 在里面重写:
public function username()
{
return 'name';
}
复制代码
重写跳转
protected $redirectTo = '/';
复制代码
控制器写完 接下来 修改一下 login 的页面 英文的换 中文 就不说了
ok 上面修改完毕以后 我们把系统自带的 认证当做 我们的前台用户的认证 接下来我们开始改造后台认证
开始 自定义 guard
- 打开config中的 auth.php,代码如下:
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'token',
'provider' => 'users',
],
//这个admin是自定义的guards 如果有多个认证 可以写多个
'admin' => [
'driver' => 'session', //这个是使用的驱动
'provider' => 'admins', //这个是你自定的 所对应的是下面的这个
],
],
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => App\User::class,
],
//这个是定义的 providers
'admins' => [
'driver' => 'eloquent',
'model' => App\Model\Admin::class, //这个是自定义的Modle类
]
]
复制代码
上面 App\Model\Admin::class 中的 Admin 是我 后台用户表 叫做 amdin
- 开始建model类
php artisan make:model Model/Admin
复制代码
运行完毕,就会看到:
laravel 5.5 project
├── app
└──Model
└──Admin.php
复制代码
其中 Admin.php 的代码内容是:
<?php
namespace App\Model;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
class Admin extends Authenticatable
{
use Notifiable;
protected $fillable = [
'name', 'password', //你要验证的字段
];
/**
* 数组隐藏的属性
*
* @var array
*/
protected $hidden = [
'password', 'remember_token',
];
}
复制代码
写完Model以后 重点开始 :
写路由
/** 前端路由开始 ***/
Auth::routes();
Route::get('/','Home\IndexController@index')->middleware('auth');
/** 前端路由 结束 **/
/** 后台登录 **/
Route::get('admin/login','Admin\LoginController@showLoginForm');
Route::get('admin/logout','Admin\LoginController@logout')->name('admin-logout');
Route::post('admin/login','Admin\LoginController@login')->name("admin-login");
/** 后台路由 **/
Route::group(['prefix'=>'admin','middleware'=>'auth:admin'],function () {
Route::get('/','Admin\IndexController@index');
});
复制代码
写后端登录验证:
上面路由中 我们看到 有 LoginController 控制器 所以 命令行走起:
php artisan make:controller Admin/LoginController
复制代码
运行完毕以后 打开: app/Http/controller/Admin/LoginController.php 开始写验证:代码是
<?php
namespace App\Http\Controllers\Admin;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
class LoginController extends Controller
{
// 展示后台登录的页面
public function showLoginForm()
{
return view('admin.login');
}
//处理登录操作
public function login(Request $request)
{
//auth('admin') 你自定义的grude attempt(['要验证的字段'=>'发送过来的值'])
$res = auth('admin')->attempt(['name' => $request->get('name'), 'password' => $request->get('password')]);
//返回 bool值
if ($res) {
return redirect('admin');
} else {
return redirect('admin/login');
}
}
//退出
public function logout()
{
auth('admin')->logout();
return redirect('admin/login');
}
}
复制代码
如上代码所示 登录成功以后 就可以通过redirect 跳转
写http请求处理:
找到Exceptions 目录下的 Handler.php 文件 重写 下面方法:
<?php
protected function unauthenticated($request, AuthenticationException $exception)
{
if ($request->expectsJson()) {
return response()->json(['error' => 'Unauthenticated.'], 401);
}
if(empty($exception->guards())){
return redirect()->guest('login');
}
//中间件各模块之间跳转问题
return redirect()->guest($exception->guards()[0].'/login');
}
复制代码
Ok 至此后台登录也写完毕了
在后台首页中如何如何获取登录的用户的信息
$users = auth()->user();
dd($users);就会看到用户的信息
复制代码