路由中间件之 RedirectIfAuthenticated

未匹配的标注

简介

[
    'App\Http\Middleware\EncryptCookies',
    'Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse',
    'Illuminate\Session\Middleware\StartSession',
    'Illuminate\View\Middleware\ShareErrorsFromSession',
    'App\Http\Middleware\VerifyCsrfToken',
    'Illuminate\Routing\Middleware\SubstituteBindings',
    'App\Http\Middleware\RedirectIfAuthenticated',  // 本章内容
]

RedirectIfAuthenticated 中间件作用就是当请求页是 注册、登录、忘记密码 时,检测用户是否已经登录,如果已经登录,那么就重定向到首页,如果没有就打开相应界面。

此中间件,非 web 通用中间件,它应该设定在控制器中,作用于特定方法。

中间件位置

protected $routeMiddleware = [
    'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
    'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
    'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
    'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
    'can' => \Illuminate\Auth\Middleware\Authorize::class,
    'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,  // 在这里。。
    'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
    'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
];

控制器使用示例

<?php

namespace App\Http\Controllers\Auth;

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

// 例如登录控制器
class LoginController extends Controller
{
    use AuthenticatesUsers;

    protected $redirectTo = '/home';

    public function __construct()
    {
        // 除了退出方法,其它都用 RedirectIfAuthenticated 中间件
        $this->middleware('guest')->except('logout');
    }
}

中间件 handle 方法

public function handle($request, Closure $next, $guard = null)
{
    // 如果登录过则重定向到首页
    if (Auth::guard($guard)->check()) {
        return redirect('/home');
    }

    // 否则打开相应界面
    return $next($request);
}

关于 Auth::guard($guard)->check() 我简单说一下:

Auth 门面返回的服务标识符是 auth,而 Laravel 在 boot 启动中,就成功注册了 auth 对应的服务,如下:

protected function registerAuthenticator()
{
    $this->app->singleton('auth', function ($app) {            
        $app['auth.loaded'] = true;
        return new AuthManager($app);
    });

    $this->app->singleton('auth.driver', function ($app) {
        return $app['auth']->guard();
    });
}

对应的是 AuthManager 类对象。那么其 guard 方法返回的就是 auth.php 配置文件配置好的授权检测驱动对象。而这个驱动对象的 check 方法实际检测的是 驱动中获取模型对象是否为null,如果是那么就代表未授权,如果不是就代表已授权。

本篇如有错误、不当或者需补充的内容,请各位同僚多提宝贵意见。

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 0
发起讨论 只看当前版本


暂无话题~