2017-09-18 14 views
3

Laravelの複数認証がEloquentではなくDoctrineを使用するようにしようとしています。私は複数のことを試しましたが、つづきます。私は現在、2つのガード、2つのモデル、2つのログインコントローラなどを定義しています。どちらか一方を有効にすると、それらは機能します。両方を同時に試してみると、デフォルトのガードだけが動作するようです。他のガードにアクセスしようとすると、間違ったログインページにリダイレクトされます。Laravel 5.5マルチ認証ルーティングの問題

私は/ログインに行く場合は、 - (ログインせずに)

私は/家に行けば

を期待通りに動作します - 私は、AS /レジスタ - 作品に行けば

を期待通りに/ログインにリダイレクト

私は/管理/ログインに行く場合を予想 -

私は/管理に行けば

を期待通りに動作します(のWi - 私は/管理/登録に行けば

を期待通りに動作しますログインしている) - fail - は/ admin/loginにリダイレクトされるはずですが、代わりに/ loginにリダイレクトされる必要があります。

私は何か簡単なことがないと確信しています。すべてが個別に機能します。それはちょうど正しいミドルウェアを使用する/ adminルートを取得しています...私はおそらく...?

マイroutesファイル:

Auth::routes(); 

// staff authentication routes 
Route::group([ 'middleware' => [ 'web' ] ], function() { 
    Route::get('admin/login', 'Auth\[email protected]'); 
    Route::post('admin/login', [ 'as' => 'staff.login', 'uses' => 'Auth\[email protected]' ]); 
    Route::get('admin/register', 'Auth\[email protected]'); 
    Route::post('admin/register', [ 'as' => 'staff.register', 'uses' => 'Auth\[email protected]' ]); 

    Route::group([ 'middleware' => [ 'staff' ] ], function() { 
    Route::get('/admin', '[email protected]')->name('admin'); 
    }); 
}); 

Route::get('/home', '[email protected]')->name('home'); 

私は様々なルート定義を試みたが、これは、最新の繰り返しです。これまでの反復もいずれもうまくいきませんでした。

マイ認証ファイル:

'defaults' => [ 
    'guard' => 'web', 
    'passwords' => 'users', 
], 

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

    'api' => [ 
     'driver' => 'token', 
     'provider' => 'users', 
    ], 

    'staff' => [ 
     'driver' => 'session', 
     'provider' => 'adminusers', 
    ] 
], 

'providers' => [ 
    'users' => [ 
     'driver' => 'doctrine', 
     'model' => App\Users\Customer::class, 
    ], 
    'adminusers' => [ 
     'driver' => 'doctrine', 
     'model' => App\Users\Staff::class, 
    ] 
], 

'passwords' => [ 
    'users' => [ 
     'provider' => 'users', 
     'table' => 'password_resets', 
     'expire' => 60, 
    ], 
    'adminusers' => [ 
     'provider' => 'adminusers', 
     'table' => 'password_resets', 
     'expire' => 30, 
    ], 
], 

マイLoginController(箱から出してと基本的に同じ):

class LoginController extends Controller { 
    use AuthenticatesUsers; 

    protected $redirectTo = '/home'; 

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

マイStaffLoginController:

<?php 

class StaffLoginController extends Controller { 
    use AuthenticatesUsers; 

    protected $redirectTo = '/admin'; 

    protected $guard = 'staff'; 

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

    public function showLoginForm() { 
    return view('auth.staff.login'); 
    } 

    public function login(Request $request) { 
    $this->validate($request, [ 
     'email' => 'required|email', 
     'password' => 'required', 
    ]); 

    if(auth()->guard('staff')->attempt([ 
     'email' => $request->input('email'), 
     'password' => $request->input('password'), 
    ])) { 
     return view('staff'); 
    } else { 
     return view('auth.staff.login')->withErrors([ 'email' => 'Authentication failed' ]); 
    } 
    } 

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

マイAdminController:

class AdminController extends Controller { 
    public function __construct() { 
    $this->middleware('auth:staff'); 
    } 

    public function index() { 
    return view('staff'); 
    } 
} 

マイRedirectIfStaffUnauthenticatedミドルウェア( 'スタッフ' => \ SNJ \のHttp \ミドルウェア\ RedirectIfStaffUnauthenticatedとしてHTTP \ Kernel.php routeMiddlewareに登録されて::クラス):

class RedirectIfStaffUnauthenticated { 
    public function handle($request, Closure $next, $guard = 'staff') { 
    if (!Auth::guard($guard)->check()) { 
     return view('auth.staff.login'); 
    } 

    return $next($request); 
    } 
} 

UPDATE:

web.phpで

変更ルートはとしてこのようであると(管理者/ログインおよび管理者からミドルウェアを除去/ルートを登録:

Auth::routes(); 

// staff authentication routes 
Route::get('admin/login', 'Auth\[email protected]'); 
Route::post('admin/login', [ 'as' => 'staff.login', 'uses' => 'Auth\[email protected]' ]); 
Route::get('admin/register', 'Auth\[email protected]'); 
Route::post('admin/register', [ 'as' => 'staff.register', 'uses' => 'Auth\[email protected]' ]); 

Route::group([ 'middleware' => [ 'staff' ] ], function() { 
    Route::get('/admin', '[email protected]')->name('admin'); 
}); 

Route::get('/home', '[email protected]')->name('home'); 

変化なしを。まだ動作しません。

thuslyルートを変更しようとしました( 'スタッフのミドルウェアにすべての管理ルートを置く: のAuth ::ルート();同じ

// staff authentication routes 

Route::group([ 'middleware' => [ 'staff' ] ], function() { 
    Route::get('admin/login', 'Auth\[email protected]'); 
    Route::post('admin/login', [ 'as' => 'staff.login', 'uses' => 'Auth\[email protected]' ]); 
    Route::get('admin/register', 'Auth\[email protected]'); 
    Route::post('admin/register', [ 'as' => 'staff.register', 'uses' => 'Auth\[email protected]' ]); 
    Route::get('/admin', '[email protected]')->name('admin'); 
}); 

Route::get('/home', '[email protected]')->name('home'); 

同じようにまだ動作しません。

答えて

2

<?php 

class StaffLoginController extends Controller { 
    use AuthenticatesUsers; 

    public function showLoginForm() { 
    return view('auth.staff.login'); 
    } 

    public function login(Request $request) { 
    $this->validate($request, [ 
     'email' => 'required|email', 
     'password' => 'required', 
    ]); 

    if(auth()->guard('staff')->attempt([ 
     'email' => $request->input('email'), 
     'password' => $request->input('password'), 
    ])) { 
     return view('staff'); 
    } else { 
     return view('auth.staff.login')->withErrors([ 'email' => 'Authentication failed' ]); 
    } 
    } 
} 

がAdminControllerからコンストラクタを削除し、これにあなたのStaffLoginControllerを変更

、我々は後で路線で、このミドルウェアを呼び出すしようとしています。

class AdminController extends Controller { 

    public function index() { 
    return view('staff'); 
    } 
} 

あなたはすでにadminルートを認証するための第二ミドルウェアとして定義されるので、認証ミドルウェアにガード値を渡す必要はありません。

このようなスタッフのミドルウェアを更新します。

class RedirectIfStaffUnauthenticated { 
    public function handle($request, Closure $next, $guard = null) { 
    if (Auth::guard($guard)->check()) { 

if(! $guard == 'staff') 
       { 
        return redirect()->route('staff.login.form'); 
       } 
    }else return redirect()->route('staff.login.form'); 

    return $next($request); 
    } 
} 

ここでルートを更新してください。

Route::get('admin/login', 'Auth\[email protected]'); 
Route::post('admin/login', [ 'as' => 'staff.login.submit', 'uses' => 'Auth\[email protected]' ]); 
Route::get('admin/register', 'Auth\[email protected]'); 
Route::post('admin/register', [ 'as' => 'staff.register.submit', 'uses' => 'Auth\[email protected]' ]); 
Route::group([ 'middleware' => [ 'staff' ] ], function() { 
    Route::get('/admin', '[email protected]')->name('admin'); 
}); 

また、あなたのapp/Kernel.phpを確認してくださいapp\Exceptions

$guard = array_get($exception->guards(), 0); 
     switch ($guard) { 
     case 'staff': 
     $login = 'admin/login'; 
     break; 
    case 'users': 
     $login = 'login'; 
     break; 
     default: 
     $login = 'login'; 
     break; 
    } 
    return redirect()->guest(route('login')); 

Handler.phpファイルにあなたのunauthenticated機能に以下の行を追加し、あなたはguestapp/Http/Middleware/RedirectIfAuthenticated.phpミドルウェアの別名であることがわかります。

web.phpファイルとコントローラコンストラクタの両方でコンストラクタを呼び出す必要はありません。ここ

RedirectIfStaffUnauthenticated

ミドルウェアチェックルート/adminは認証され、それは/admin/login経路にリダイレクトされていない場合には、staffのガード値を有します。

は、この情報がお役に立てば幸い明確化のためlaravel docをお読みください。

+0

コントローラから削除しようとしました。私はまだ/ admin/loginの代わりに/ loginにリダイレクトされてしまいます。 – swp

+0

私は$ this-> middleware( 'staff')にその行を変更しようとしましたが、それは同じ効果がありました。私はまだ/ login – swp

+0

に行きます。スタッフ登録とログインルートはまだWebミドルウェアを使用しています.Web.phpファイルのWebミドルウェアからそれらを分離しようとしています – HasilT

関連する問題