web-dev-qa-db-ja.com

Laravel-ユーザーが認証されていない場合にログインにリダイレクトする方法

拡張クラス(AdminController extends AdminBaseController)の__constructorを使用しようとしていますが、どうやら機能していません。何ができるのかわかりません。私のクラスの両方:

AdminBaseController.php

class AdminBaseController extends Controller
{
    public function __construct(){
        if (!Auth::user()){
            return view('admin.pages.login.index');
        }
    }
}

AdminController.php

class AdminController extends AdminBaseController
{
    public function __construct(){
        parent::__construct();
    }

    public function index()
    {
        return view('admin.pages.admin.index');
    }

    public function ajuda()
    {
        return view('admin.pages.admin.ajuda');
    }
}

編集


これは私のadminルートグループです。

Route::group([
    'prefix' => 'admin',
    'middleware' => 'auth'
], function () {
    Route::get('/', 'Admin\AdminController@index');

    Route::get('login', 'Admin\AuthController@getLogin');
    Route::post('login', 'Admin\AuthController@postLogin');
    Route::get('logout', 'Admin\AuthController@getLogout');

    Route::group(['prefix' => 'configuracoes'], function () {
        Route::get('geral', 'Admin\AdminConfiguracoesController@geral');
        Route::get('social', 'Admin\AdminConfiguracoesController@social');
        Route::get('analytics', 'Admin\AdminConfiguracoesController@analytics');
    });

    Route::get('ajuda', 'Admin\AdminController@ajuda');
});
10
Caio Kawasaki

コントローラは、ユーザーが認証されているかどうかを確認するのに適切な場所ではありません。そのためにはミドルウェアを使用する必要があります。ミドルウェアが何であるかについての情報を取得するには here

この目的でデフォルトのLaravelのauthミドルウェアを使用する方法を見てみましょう。

まず、AdminBaseControllerを取り除き、AdminControllerのみを使用します

次に、ファイルapp\Http\Kernel.phpauthミドルウェアが有効になっていることを確認する必要があります

次の行が必要です。

protected $routeMiddleware = [
    'auth' => \App\Http\Middleware\Authenticate::class,

これは、ミドルウェアがアクティブであり、ルートで使用できることを意味します。

app\Http\Middleware\Authenticate.phpのミドルウェアクラス内に移動して、ミドルウェアの動作を指定しましょう。

//this method will be triggered before your controller constructor
public function handle($request, Closure $next)
{
    //check here if the user is authenticated
    if ( ! $this->auth->user() )
    {
        // here you should redirect to login 
    }

    return $next($request);
}

あとは、ミドルウェアを適用するルートを決定するだけです。認証されたユーザーからのみアクセスできるようにする2つのルートがあるとします。この2つのルートにミドルウェアを使用するように指定する必要があります。

Route::group( ['middleware' => 'auth' ], function()
{
    Route::get('admin/index', 'AdminController@index');
    Route::get('admin/ajuda', 'AdminController@ajuda');
});
14
Moppo

この目的でミドルウェアを使用し、コントローラーコンストラクターで以下の例のように使用します。

public function __construct()
{
    $this->middleware('guest', ['except' => 'logout']);
}

そして、ユーザーからログインしてアクセスするルートを保護する必要があります。

Route::group(['middleware' => 'auth'], function() {
      Route::get('/dashboard', 'DashboardController@index');
});
3
Denis

Laravel 5.5では、認証されていないユーザーがAuthenticateミドルウェアにAuthenticationException例外をスローさせます。

protected function authenticate(array $guards)
{
 if (empty($guards))
 {
  return $this->auth->authenticate();
 }
 foreach ($guards as $guard) {
  if ($this->auth->guard($guard)->check()) {
      return $this->auth->shouldUse($guard);
  }
 }
 throw new AuthenticationException('Unauthenticated.', $guards);
}

これは、特定の例外をHTTP応答に変換するrenderメソッドを呼び出すapp/Exceptions/Handlerクラスによってキャッチされます。

public function render($request, Exception $exception)
{
 return parent::render($request, $exception);
}

App/Exceptions/Handlerは、「/ vendor/laravel/src/Illuminate/Foundation/Exceptions/Handler」内にある「Illuminate\Foundation\Exceptions\Handler」を拡張します。独自のレンダリングメソッドがあります。そのレンダリングメソッド内には、if elseという文。

elseif ($e instanceof AuthenticationException)
{
 return $this->unauthenticated($request, $e);
}

以下は、同じクラス内で上記によって呼び出される「認証されていない」メソッドです

protected function unauthenticated($request, AuthenticationException $exception)
{
  return $request->expectsJson() ? response()->json(['message' => $exception->getMessage()], 401) : redirect()->guest(route('login'));
}

このメソッド内では、認証されていないユーザーをリダイレクトします。

私が見る限り、これは舞台裏で起こっていることです。

2
Bruce Tong

親コンストリクターを拡張して実行する方法は正しいですが、ビューを返して実行することは、ルート、コントローラーアクション、フィルターからのみ可能です。それ以外の場合は、send()を呼び出す必要があります。

あなたの目的のために、私はあなたがフィルタのために前に使用すべきだと思います http://laravel.com/docs/4.2/routing#route-filters

0
zt1983811