Laravel 多用户认证

作者:南丞 时间:2017-11-17 08:40

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

评论:

回到顶部
回到顶部