尝试使用 Doctrine 而非 Eloquent 来实现 Laravel 多重身份验证。我尝试了多种方法,但仍然卡在某个地方。我目前定义了两个保护器、两个模型、两个登录控制器等等。如果我启用其中一个,那么它能够工作。如果我同时尝试两者,只有默认的保护器似乎能够工作。当我尝试访问其他保护器时,我会被重定向到错误的登录页面。
如果我进入 /login - 正常工作
如果我进入 /home (未登录)- 正确重定向到 /login
如果我进入 /register - 正常工作
如果我进入 /admin/login - 正常工作
如果我进入 /admin/register - 正常工作
如果我进入 /admin (未登录)- 失败 - 应该被重定向到 /admin/login,但实际上被重定向到 /login
我相信我漏掉了一些简单的东西。所有东西都可以单独工作。只是让 /admin 路由使用正确的中间件...我想...也许?
我的路由文件:
我尝试了各种路由定义,但这是最新的迭代。以前的迭代也都不起作用。
我的授权文件:
如果我进入 /login - 正常工作
如果我进入 /home (未登录)- 正确重定向到 /login
如果我进入 /register - 正常工作
如果我进入 /admin/login - 正常工作
如果我进入 /admin/register - 正常工作
如果我进入 /admin (未登录)- 失败 - 应该被重定向到 /admin/login,但实际上被重定向到 /login
我相信我漏掉了一些简单的东西。所有东西都可以单独工作。只是让 /admin 路由使用正确的中间件...我想...也许?
我的路由文件:
Auth::routes();
// staff authentication routes
Route::group( [ 'middleware' => [ 'web' ] ], function() {
Route::get( 'admin/login', 'Auth\StaffLoginController@showLoginForm' );
Route::post( 'admin/login', [ 'as' => 'staff.login', 'uses' => 'Auth\StaffLoginController@login' ] );
Route::get( 'admin/register', 'Auth\StaffRegisterController@showRegistrationForm' );
Route::post( 'admin/register', [ 'as' => 'staff.register', 'uses' => 'Auth\StaffRegisterController@register' ] );
Route::group( [ 'middleware' => [ 'staff' ] ], function() {
Route::get( '/admin', 'AdminController@index' )->name( 'admin' );
});
});
Route::get('/home', 'HomeController@index')->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 中间件(已在 Http\Kernel.php 路由中间件注册为 'staff' => \SNJ\Http\Middleware\RedirectIfStaffUnauthenticated::class,):
class RedirectIfStaffUnauthenticated {
public function handle( $request, Closure $next, $guard = 'staff' ) {
if ( !Auth::guard( $guard )->check() ) {
return view( 'auth.staff.login' );
}
return $next( $request );
}
}
更新:
更改了web.php中的路由如下(从admin/login和admin/register路由中移除了中间件):
Auth::routes();
// staff authentication routes
Route::get( 'admin/login', 'Auth\StaffLoginController@showLoginForm' );
Route::post( 'admin/login', [ 'as' => 'staff.login', 'uses' => 'Auth\StaffLoginController@login' ] );
Route::get( 'admin/register', 'Auth\StaffRegisterController@showRegistrationForm' );
Route::post( 'admin/register', [ 'as' => 'staff.register', 'uses' => 'Auth\StaffRegisterController@register' ] );
Route::group( [ 'middleware' => [ 'staff' ] ], function() {
Route::get( '/admin', 'AdminController@index' )->name( 'admin' );
});
Route::get('/home', 'HomeController@index')->name('home');
没有变化,仍然无法正常工作。
尝试更改路由如下(将所有管理员路由放入 'staff' 中间件中): Auth::routes();
// staff authentication routes
Route::group( [ 'middleware' => [ 'staff' ] ], function() {
Route::get( 'admin/login', 'Auth\StaffLoginController@showLoginForm' );
Route::post( 'admin/login', [ 'as' => 'staff.login', 'uses' => 'Auth\StaffLoginController@login' ] );
Route::get( 'admin/register', 'Auth\StaffRegisterController@showRegistrationForm' );
Route::post( 'admin/register', [ 'as' => 'staff.register', 'uses' => 'Auth\StaffRegisterController@register' ] );
Route::get( '/admin', 'AdminController@index' )->name( 'admin' );
});
Route::get('/home', 'HomeController@index')->name('home');
一样的问题,还是没有解决。