立即注册 登录
81路工程师大巴 - 81Lu.Net 返回首页

lurenj的个人空间 http://www.81lu.net/?810046 [收藏] [复制] [RSS]

博客

laravel5.4多用户认证和中间件(middleware)的使用

已有 385 次阅读2017-5-9 12:13 |个人分类:laravel|系统分类:综合| laravel, laravel中间件, laravel

1、laravel自带了一个用户认证系统,要使用的话,直接运行一下命令就可以用了

php artisan make:auth
会生成相应的控制器、路由和模版文件



2、运行一下语句,会生成两个数据迁移文件和相应的数据表(users、password_resets),注意提前配置好数据库链接

php artisan migrate


3、多用户认证

如果只是需要完善一个类型的用户资料字段,那么只需要添加一个users表的数据迁移文件,再执行迁移就行了

但如果想添加更多不同类型的用户(比如前台用户、商家用户、管理员用户等等),要怎么办呢?



4、修改用户认证配置(增加“守卫”和“服务提供者”)

打开 config/auth.php 配置看一下就知道什么是“守卫”了

'guards' => [   
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],

    'api' => [
        'driver' => 'token',
        'provider' => 'users',
    ],
],
所谓的“守卫”就laravel认证系统的端口,默认已经有两个“守卫”了,一个守web进口的,一个守api接口进口的

现在如果想添加一个后台“守卫”的话,就增加一个配置就行了(driver 表示认证系统用什么来驱动,provider 表示认证服务由谁的提供)

'admin' => [
    'driver' => 'session',
    'provider' => 'admins',
],
上面配置了一个admins服务提供者,所以相应的,还需要在 providers(服务提供者)列表里添加一个配置

'providers' => [
    'users' => [
        'driver' => 'eloquent',
        'model' => App\User::class,
    ],
    
    'admins' => [
        'driver' => 'eloquent',
        'model' => App\Admin::class,
    ],
],


5、配置完之后,但提供服务的 Eloquent 模型还是不存在的,运行下面语句创建模型

php artisan make:model Admin --migration
“--migration”  参数是同时生成相应的数据迁移文件的意思



Admin模型的内容大概是这样的:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;

class AdminController extends Controller
{

    public function __construct()
    {
        $this->middleware('auth:admin');
    }

    public function index()
    {
        
//$admin = Auth::guard('admin')->user();//指明使用admin守卫
$admin = Auth::user();//默认使用中间件的admin守卫。PS:$this->middleware('auth:admin')
        return $admin->name;
    }

}
关键的地方是 $this->middleware('auth:admin'),关键laravel你要用的“守卫”是admin,否则打印的 Auth::user 将会是默认的前台用户信息



6、按自己的需求填一下数据迁移文件,再执行一下迁移(生成数据表)(这里演示的偷懒了,直接复制前台的用户表来玩的)

Schema::create('admins', function (Blueprint $table) {
    $table->increments('id');
    $table->string('name');
    $table->string('email')->unique();
    $table->string('password', 60);
    $table->rememberToken();
    $table->timestamps();
});
然后再运行以下命令执行迁移(在数据库中创建表)

php artisan migrate


7、添加访问路由,laravel的auth路由在 /vendor/laravel/framework/src/Illuminate/Routing/Router.php 里的 auth 方法里(其他版本同理)

直接复制前台路由,加一个后台路由组就行了,大概是这个样子:

注意路由后面的路由命名不能重复,否则在视图里面使用route('login')做路径时,会产生错误。


$this->group(['prefix'=>'admin', 'namespace'=>'Admin', 'middleware'=>'adminview'], function(){

// Authentication Routes...

$this->get('login', 'Auth\LoginController@showLoginForm')->name('admin.login');

$this->post('login', 'Auth\LoginController@login');

$this->post('logout', 'Auth\LoginController@logout')->name('admin.logout');


// Registration Routes...

$this->get('register', 'Auth\RegisterController@showRegistrationForm')->name('admin.register');

$this->post('register', 'Auth\RegisterController@register');


// Password Reset Routes...

$this->get('password/reset', 'Auth\ForgotPasswordController@showLinkRequestForm');

$this->post('password/email', 'Auth\ForgotPasswordController@sendResetLinkEmail');

$this->get('password/reset/{token}', 'Auth\ResetPasswordController@showResetForm');

$this->post('password/reset', 'Auth\ResetPasswordController@reset');

});



上面路由组里定义使用了一个Admin的命名空间和一个adminview的中间件,中间件的作用稍后再说,然后先把命名空间下的控制器搞定。





在routes/web.php 里添加一个后台首页的路由,


Route::get('/admin','AdminController@index');



8、路由有了,但Admin命名空间下的路由还一个控制器还没有呢!!然后把默认Auth的控制器直接复制过去,然后修改


LoginController 和 RegisterController 控制器里命名空间为

namespace App\Http\Controllers\Admin\Auth;


然后找到 Admin\Auth\RegisterController 控制器,有三处改动:

1、类头部把 use App\User 改成 use App\Admin;

2、redirectTo 属性值改成 protected $redirectTo = '/admin';

3、create 方法里把 User 模型改成 Admin 模型



然后找到 Admin\Auth\LoginController 控制器,也是三处改动:

1、类头部声明使用 Auth 门面,use Illuminate\Support\Facades\Auth;

2、redirectTo 属性值改成 protected $redirectTo = '/admin';

3、加 guard 方法来自定义使用的 “守卫”,看这里

<?php

namespace App\Http\Controllers\Admin\Auth;

use Illuminate\Support\Facades\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers;

class LoginController extends Controller
{
    /*
    |--------------------------------------------------------------------------
    | Login Controller
    |--------------------------------------------------------------------------
    |
    | This controller handles authenticating users for the application and
    | redirecting them to your home screen. The controller uses a trait
    | to conveniently provide its functionality to your applications.
    |
    */

    use AuthenticatesUsers;

    /**
     * Where to redirect users after login.
     *
     * @var string
     */
    protected $redirectTo = '/admin';

    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('guest', ['except' => 'logout']);//此处可以写成guest:admin,登陆后台后再访问admin/login会跳转到admin
    }

protected function guard()
    {
        return Auth::guard('admin');
    }
}


9、控制器准备好之后,然后复制视图模版了,把前台默认的模板直接拷贝到resources\views\admin\auth中

模版内容里直接修改,form表单的提交地址分别成 {{ url('admin.login') }} 和 {{ url('admin.login') }} 

PS:提交地址要和  /vendor/laravel/framework/src/Illuminate/Routing/Router.php 后台路由组中的路由名字相同,不然报错

10、修改登录页面控制器 vendor\laravel\framework\src\Illuminate\Foundation\Auth\AuthenticatesUsers 的showLoginForm()方法 和 vendor\laravel\framework\src\Illuminate\Foundation\Auth\RegistersUsers 的showRegistrationForm()

里面都是直接return 前台视图,(后台的模版地址是 admin.auth.login 和 admin.auth.register),所以要加一个判断,来判断动态显示前台模版和后台模版




这里需要判断,然后选择返回相应的视图,在请求后,返回前要操作的东西,可以使用中间件。




11、前面已经在后台路由组中添加中间件了,那么现在创建后台路由组的中间件(中间件:添加在路由组上后,在访问路由组中的路由时,会自动执行中间件的操作。PS:此处还可以设置多语言网站,在此就先不多说了,需要了解的可继续关注此博客)


php artisan make:middleware AdminView

中间件是需要在 app/Http/kernel.php 里注册的,在 $routeMiddleware 数组后加上就行了


'adminview' => \App\Http\Middleware\AdminView::class,



AdminView 中间件文件内容:


<?php


namespace App\Http\Middleware;


use Closure;


class AdminView

{

    /**

     * Handle an incoming request.

     *

     * @param  \Illuminate\Http\Request  $request

     * @param  \Closure  $next

     * @return mixed

     */

    public function handle($request, Closure $next)

    {

        $request->is_admin = true;//在请求模型里给$request添加一个is_admin的属性,设置为ture

        return $next($request);

    }

}

然后修改 vendor\laravel\framework\src\Illuminate\Foundation\Auth\AuthenticatesUsers 的showLoginForm()方法 


和vendor\laravel\framework\src\Illuminate\Foundation\Auth\RegistersUsers 的showRegistrationForm()


public function showLoginForm(Request $request)

{

    if ($request->is_admin) {

        return view('admin.auth.login');

    }else{

        return view('auth.login');

    }

}

/***********************/

public function showRegistrationForm(Request $request)

{

    if ($request->is_admin) {

        return view('admin.auth.register');

    } else {

        return view('auth.register');

    }

}

此时就可以访问 http://域名/admin/register 和 http://域名/admin/login 来测试注册后台和登录后台了。

最后,如果成功登录了后台,然后再访问 /admin/register 或 /admin/login 的话,会发现不会跳转到 /admin 里,而是直接跳转到home,但是home需要登陆才能进入,所以又跳转到了前台login页面

照理来说登录之后应该是要跳 /admin 的,而不是 /home 的,什么原来呢??

其实就是 LoginController 和 RegisterController 里的构造方法里都写了使用一个叫 guest 的中间件,找到 app/http/kernel.php,然后找到这个中间件的类在这里:

修改 RedirectIfAuthenticated 类的 handle 方法如下:


public function handle($request, Closure $next, $guard = null)

{

    if (Auth::guard($guard)->check()) {

        if ($request->is_admin) {

            return redirect('/admin');

        } else {

            return redirect('/home');

        }

    }


    return $next($request);

}

此时再测试下就正常了。

-------------------------------

如果想要了解更多laravel,请继续关注我的博客。

后面会再更新 laravel多语言网站的教程。


路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 立即注册

手机版|小黑屋|81路工程师大巴 - 81Lu.Net ( 豫ICP备15009715号 )

GMT+8, 2017-11-21 15:54

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

返回顶部