コンストラクターに次のコントローラーがあります。
$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/facebook
、auth/facebook/callback
、またはauth/facebook/unlink
にアクセスすると、ミドルウェアによって拒否され、ホームページに戻されます。
/
のルートと正確に一致するように、routes.php
を続行して「except」ルールを指定しようとしましたが、違いはありません。デフォルトの「ログアウト」ルールが尊重されているのに、これらのルールが無視されている理由はありますか?
乾杯!
URIの代わりにメソッド名を通知する必要があります。
<?php
namespace App\Http\Controllers;
class MyController extends Controller {
public function __construct() {
$this->middleware('guest', ['except' => [
'redirectToFacebook', 'handleFacebookCallback', 'handleFacebookUnlink'
]]);
}
}
Laravelドキュメントに従おうとしている場合は、/ Http/Middleware /VerifyCsrfToken.phpファイルの$ except変数にルートを追加することで、これに対する代替ソリューションが提案されます。ドキュメントには次のように書かれています。次のように追加します。
'route/*'
しかし、それを機能させる唯一の方法は、次のように無視するルートを配置することです。
'/route'
この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);
}
}