【发布时间】:2019-10-18 19:23:03
【问题描述】:
我正在实施多重身份验证,因为我有 3 个不同的用户组。我正在尝试以下步骤。
LoginController.php
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
use Illuminate\Http\Request;
use Auth;
class LoginController extends Controller
{
use AuthenticatesUsers;
protected $redirectTo = '/home';
public function __construct()
{
$this->middleware('guest')->except('logout');
$this->middleware('guest:admin')->except('logout');
$this->middleware('guest:manager')->except('logout');
$this->middleware('guest:vendor')->except('logout');
}
public function showAdminLoginForm()
{
return view('auth.login', ['url' => 'admin']);
}
public function adminLogin(Request $request)
{
$this->validate($request, [
'email' => 'required|email',
'password' => 'required|min:6'
]);
if (Auth::guard('admin')->attempt(['email' => $request->email, 'password' => $request->password], $request->get('remember'))) {
return redirect()->intended('/admin');
}
return back()->withInput($request->only('email', 'remember'));
}
public function showManagerLoginForm()
{
return view('auth.login', ['url' => 'manager']);
}
public function managerLogin(Request $request)
{
$this->validate($request, [
'email' => 'required|email',
'password' => 'required|min:6'
]);
if (Auth::guard('manager')->attempt(['email' => $request->email, 'password' => $request->password], $request->get('remember'))) {
return redirect()->intended('/manager');
}
return back()->withInput($request->only('email', 'remember'));
}
public function showVendorLoginForm()
{
return view('auth.login', ['url' => 'vendor']);
}
public function vendorLogin(Request $request)
{
$this->validate($request, [
'email' => 'required|email',
'password' => 'required|min:6'
]);
if (Auth::guard('vendor')->attempt(['email' => $request->email, 'password' => $request->password], $request->get('remember'))) {
return redirect()->intended('/vendor');
}
return back()->withInput($request->only('email', 'remember'));
}
}
AdminController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Auth;
class AdminController extends Controller
{
public function __construct()
{
$this->middleware('guest:admin');
}
public function dashboard()
{
dd(auth()->user());
return view('admin');
}
}
ManagerController 和 VendorController 与 AdminController 相同。
Web.php
Route::view('/', 'welcome');
Auth::routes();
Route::prefix('admin')->group(function () {
Route::get('/login', 'Auth\LoginController@showAdminLoginForm');
Route::post('/login', 'Auth\LoginController@adminLogin');
Route::get('/register', 'Auth\RegisterController@showAdminRegisterForm');
Route::post('/register', 'Auth\RegisterController@createAdmin');
});
Route::prefix('manager')->group(function () {
Route::get('/login', 'Auth\LoginController@showManagerLoginForm');
Route::post('/login', 'Auth\LoginController@managerLogin');
Route::get('/register', 'Auth\RegisterController@showManagerRegisterForm');
Route::post('/register', 'Auth\RegisterController@createManager');
});
Route::prefix('vendor')->group(function () {
Route::get('/login', 'Auth\LoginController@showVendorLoginForm');
Route::post('/login', 'Auth\LoginController@vendorLogin');
Route::get('/register', 'Auth\RegisterController@showVendorRegisterForm');
Route::post('/register', 'Auth\RegisterController@createVendor');
});
Route::view('/home', 'home')->middleware('auth');
Route::get('/admin', 'AdminController@dashboard');
Route::get('/manager', 'ManagerController@dashboard');
Route::get('/vendor', 'VendorController@dashboard');
RedirectIfAuthenticated.php
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Support\Facades\Auth;
class RedirectIfAuthenticated
{
public function handle($request, Closure $next, $guard = null)
{
if ($guard == "admin" && Auth::guard($guard)->check()) {
return redirect('/admin');
}
if ($guard == "manager" && Auth::guard($guard)->check()) {
return redirect('/manager');
}
if ($guard == "vendor" && Auth::guard($guard)->check()) {
return redirect('/vendor');
}
if (Auth::guard($guard)->check()) {
return redirect('/home');
}
return $next($request);
}
}
config.auth.php
<?php
return [
'defaults' => [
'guard' => 'admin',
'passwords' => 'admins',
],
'guards' => [
'admin' => [
'driver' => 'session',
'provider' => 'admins',
],
'manager' => [
'driver' => 'session',
'provider' => 'managers',
],
'vendor' => [
'driver' => 'session',
'provider' => 'vendors',
],
'api' => [
'driver' => 'token',
'provider' => 'users',
'hash' => false,
],
],
'providers' => [
'admins' => [
'driver' => 'eloquent',
'model' => App\Admin::class,
],
'managers' => [
'driver' => 'eloquent',
'model' => App\Manager::class,
],
'vendors' => [
'driver' => 'eloquent',
'model' => App\Vendor::class,
],
],
'passwords' => [
'admins' => [
'provider' => 'admins',
'table' => 'password_resets',
'expire' => 60,
],
'managers' => [
'provider' => 'managers',
'table' => 'password_resets',
'expire' => 60,
],
'vendors' => [
'provider' => 'vendors',
'table' => 'password_resets',
'expire' => 60,
],
],
];
当我试图通过在 AdminController 上执行 dd() 来获取 Auth::user() 时,由于多重身份验证,它显示为 null。虽然登录成功。我假设我没有为管理员使用适当的防护。但与此同时,我不知道如何解决这个问题。请帮帮我。
【问题讨论】:
-
在您的模型中,您使用了
class Admin extends Authenticatable还是扩展了Model类?
标签: php laravel laravel-5 laravel-authentication