web-dev-qa-db-ja.com

Laravelミドルウェア '例外'ルールが機能しない

コンストラクターに次のコントローラーがあります。

$this->middleware('guest', ['except' =>
    [
        'logout',
        'auth/facebook',
        'auth/facebook/callback',
        'auth/facebook/unlink'
    ]
]);

'logout'ルール(デフォルトであります)は完全に機能しますが、追加した他の3つのルールは無視されます。 routes.phpのルートは次のようになります。

Route::group(['middleware' => ['web']],function(){

    Route::auth();

    // Facebook auth
    Route::get('/auth/facebook', 'Auth\AuthController@redirectToFacebook')->name('facebook_auth');
    Route::get('/auth/facebook/callback', 'Auth\AuthController@handleFacebookCallback')->name('facebook_callback');
    Route::get('/auth/facebook/unlink', 'Auth\AuthController@handleFacebookUnlink')->name('facebook_unlink');
}

ログイン中にauth/facebookauth/facebook/callback、またはauth/facebook/unlinkにアクセスすると、ミドルウェアによって拒否され、ホームページに戻されます。

/のルートと正確に一致するように、routes.phpを続行して「except」ルールを指定しようとしましたが、違いはありません。デフォルトの「ログアウト」ルールが尊重されているのに、これらのルールが無視されている理由はありますか?

乾杯!

7
jd182

URIの代わりにメソッド名を通知する必要があります。

<?php

namespace App\Http\Controllers;

class MyController extends Controller {
    public function __construct() {
        $this->middleware('guest', ['except' => [
            'redirectToFacebook', 'handleFacebookCallback', 'handleFacebookUnlink'
        ]]);
    }
}
23
Lucas Silva

Laravelドキュメントに従おうとしている場合は、/ Http/Middleware /VerifyCsrfToken.phpファイルの$ except変数にルートを追加することで、これに対する代替ソリューションが提案されます。ドキュメントには次のように書かれています。次のように追加します。

'route/*'

しかし、それを機能させる唯一の方法は、次のように無視するルートを配置することです。

'/route'
0
Tyler Pashigian

このinExceptArray関数を追加することで、ミドルウェアでこの問題を解決しました。 VerifyCsrfTokenが配列を除いて処理するのと同じ方法です。

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;

class MyMiddleware
{
    /**
     * Routes that should skip handle.
     *
     * @var array
     */
    protected $except = [
        '/some/route',
    ];

    /**
     * Determine if the request has a URI that should pass through.
     *
     * @param Request $request
     * @return bool
     */
    protected function inExceptArray($request)
    {
        foreach ($this->except as $except) {
            if ($except !== '/') {
                $except = trim($except, '/');
            }

            if ($request->is($except)) {
                return true;
            }
        }

        return false;
    }

    /**
     * Handle an incoming request.
     *
     * @param  Request  $request
     * @param Closure $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        // check user authed or API Key
        if (!$this->inExceptArray($request)) {
            // Process middleware checks and return if failed...
            if (true) {
              // Middleware failed, send back response
              return response()->json([
                'error' => true,
                'Message' => 'Failed Middleware check'
            ]); 
            }
        }
        // Middleware passed or in Except array
        return $next($request);
    }
}
0
cmac