Laravel 多用户认证(二)

作者:南丞 时间:2018-10-13 08:40

  • 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);就会看到用户的信息

评论:

回到顶部
回到顶部