layout | title | date | author | desc | in_head |
---|---|---|---|---|---|
post
|
Laravel 多用户认证(二)
|
2018-10-13 16:40:02 +0800
|
南丞
|
Laravel是一套简洁、优雅的PHP Web开发框架(PHP Web Framework)。它可以让你从面条一样杂乱的代码中解脱出来;它可以帮你构建一个完美的网络APP,而且每行代码都可以简洁、富于表达力。
|
<style> .article-content p{ text-indent: 2em; line-height: 1.75rem; }</style>
|
- laravel 多用户认证 架构
背景
项目包含若干子站点,不同站点功能各异,但共享底层数据及逻辑。公用同一个Auth 中间件来进行多用户登录。用意是最大限度利用 Laravel 自带的认证系统。不过默认的认证都是根据 『email』和『password』字段进行的。之后有时间可能再追加自定义字段比如『phone』的改造方案。
具体方案
之前写过一种 多用户认证方法, 但是不够简便, 接下来我们使用一下 laravel 中 attempt 和 guards 配合做多用户认证
项目按照不同站点组织成不同模块,在 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
开始 自定义 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 $guard = 'admin';
protected $fillable = [
'name', 'password', //你要验证的字段
];
/**
* 数组隐藏的属性
*
* @var array
*/
protected $hidden = [
'password', 'remember_token',
];
}
写完Model以后 重点开始 :
写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');
}
写路由
/** 前端路由开始 ***/
Auth::routes();
Route::get('/','Home\IndexController@index')->middleware('auth:'); // 注意这里的 auth 后面的冒号
/** 前端路由 结束 **/
/** 后台登录 **/
Route::group(['prefix'=>'admin','namespace'=>'Admin'],function (){
Route::get('login','LoginController@index'); //登录
Route::get('logout','AuthController@logout');//退出
Route::post('login_act','AuthController@login');//提交登录
});
/** 后台路由 **/
Route::group(['prefix'=>'admin','namespace'=>'Admin','middleware'=>'auth:admin'],function ({
Route::get('/','Admin\IndexController@index');
});
写后端登录验证:
php artisan make:controller Admin/LoginController
运行完毕以后 打开: app/Http/controller/Admin/LoginController.php 代码如下,加载登录页面:
<?php
namespace App\Http\Controllers\Admin;
use App\User;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
class LoginController extends BaseController
{
public function index()
{
return view('admin.login');
}
}
写登录验证:
php artisan make:controller Admin/AuthController
运行完毕以后 打开: app/Http/controller/Admin/LoginController.php 代码如下,登录验证:
<?php
namespace App\Http\Controllers\Admin;
use App\Models\AdminLog;
use App\Services\Core;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
class AuthController extends Controller
{
use Core;
public function login(Request $request)
{
$post = $request->input();
$res = \auth('admin')->attempt(['user_name'=>$post['user_name'],'password'=>$post['password']],1);
if($res){
$user = \auth('admin')->user();
$this->AdminLog('管理员['.$user->user_name.']登录');
return redirect('admin');
}else{
return redirect('admin/login')->withInput($request->except('password'))->with('msg', '用户名或密码错误');
}
}
public function logout()
{
$user = auth('admin')->user();
$this->AdminLog('管理员['.$user->user_name.']退出登录');
auth('admin')->logout();
return redirect('admin/login');
}
}
Ok 至此后台登录也写完毕了
在后台首页中如何如何获取登录的用户的信息
$users = auth('admin')->user();
dd($users);就会看到用户的信息