尝试使用Doctrine而不是Eloquent来使Laravel多重身份验证工作。我尝试了很多事情,但一直陷入困境。我目前有两个防护定义,两个模型,两个登录控制器等。如果我启用其中一个,他们工作。如果我同时尝试两者,只有默认防护似乎有效。当我尝试访问另一个警卫时,我被重定向到错误的登录页面。
如果我去/登录 - 按预期工作
如果我去/ home(未登录) - 按预期重定向到/ login
如果我去/注册 - 按预期工作
如果我去/ 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 routeMiddleware中注册为&#39; staff&#39; =&gt; \ 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');
没有变化。仍然无法工作。
尝试改变路线(将所有管理路线放入&#39;员工&#39;中间件: AUTH ::路线();
// 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');
同样的。仍然无法工作。
答案 0 :(得分:3)
将您的StaffLoginController
更改为此
<?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中删除构造函数,我们稍后将在路由上调用此中间件。
class AdminController extends Controller {
public function index() {
return view( 'staff' );
}
}
您不需要将保护值传递给auth中间件,因为您已经将其定义为用于验证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
文件的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'));
请检查您的app/Kernel.php
,您可以看到guest
是app/Http/Middleware/RedirectIfAuthenticated.php
中间件的别名。
您不需要在web.php
文件和控制器构造函数上调用构造函数。
此处RedirectIfStaffUnauthenticated
中间件检查根/admin
是否经过身份验证,其保护值为staff
,否则将重定向到/admin/login
路由。
请阅读the most common solution以获取说明
希望这有帮助。