试图用条令而不是雄辩的方式让拉维尔多重认证生效。我试过很多次了,但还是被卡住了。我现在定义了两个守卫,两个模型,两个登录控制器,等等。如果我启用其中一个,它们就会工作。如果我同时尝试这两种方法,那么似乎只有默认的保护机制起作用。当我试图访问另一个守卫时,我被重定向到错误的登录页面。如果我转到/登录-按预期工作如果我转到/主页(未登录)-按预期重定向到/登录如果我去/注册-按预期工作如果我转到/admin/login-按预期工作如果我转到/admin/register-按预期工作如果我转到/admin(未登录)-fail-应该重定向到/admin/login,而不是重定向到/login我肯定我遗漏了一些简单的东西。每件事都是独立工作的。它只是通过/admin路径使用正确的中间件……我想……也许吧?我的路由文件:Auth::routes();// staff authentication routesRoute::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, ],],我的登录控制器(基本上与开箱即用相同):class LoginController extends Controller { use AuthenticatesUsers; protected $redirectTo = '/home'; public function __construct() { $this->middleware('guest')->except('logout'); }}我的Stafflogin控制器:<?phpclass 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' ); }}我的管理员:class AdminController extends Controller { public function __construct() { $this->middleware( 'auth:staff' ); } public function index() { return view( 'staff' ); }}我的redirectifstaffunauthenticated中间件(在http\kernel.php routemiddleware中注册为'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 routesRoute::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 routesRoute::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');一样。还是不行。 最佳答案 把你的StaffLoginController改成这个, <?phpclass 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中移除构造函数,我们稍后将在路由上调用此中间件。class AdminController extends Controller { public function index() { return view( 'staff' ); }}您不需要将保护值传递给auth middleware,因为您已经定义为用于验证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\StaffLoginController@showLoginForm' );Route::post( 'admin/login', [ 'as' => 'staff.login.submit', 'uses' => 'Auth\StaffLoginController@login' ] );Route::get( 'admin/register', 'Auth\StaffRegisterController@showRegistrationForm' );Route::post( 'admin/register', [ 'as' => 'staff.register.submit', 'uses' => 'Auth\StaffRegisterController@register' ] );Route::group( [ 'middleware' => [ 'staff' ] ], function() { Route::get( '/admin', 'AdminController@index' )->name( 'admin' );});在unauthenticated文件中的Handler.php函数中添加以下行$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'));请检查您的 >,您可以看到 >是的别名。您不需要同时在app\Exceptions文件和控制器构造函数上调用构造函数。在这里,app/Kernel.php中间件检查根guest是否经过身份验证,如果没有,它将重定向到app/Http/Middleware/RedirectIfAuthenticated.php路由。请阅读laravel doc 进行澄清希望这有帮助。
07-26 09:35