如何在 laravel 5.2 中使用多重身份验证 [关闭]
Posted
技术标签:
【中文标题】如何在 laravel 5.2 中使用多重身份验证 [关闭]【英文标题】:How to use multi Auth in laravel 5.2 [closed] 【发布时间】:2016-04-02 03:07:48 【问题描述】:有谁知道如何在 laravel 5.2 中使用多重身份验证!我想使用它但我不知道如何? 有人有设置多重身份验证的教程或项目吗?
【问题讨论】:
Here's how to use 您是否尝试过进行更多身份验证?身份验证的基础是Auth::attempt
方法(阅读更多:laravel.com/docs/5.2/authentication#authenticating-users)。
@BasheerAhmed 我的意思是我想在 laravel 5.2 中使用
这将使您对如何开始有一个基本的了解..
@GrzegorzGajda 我是 laravel 的新手!我只知道如何使用默认用户身份验证!如果你已经完成了多重身份验证,你能给我一些示例项目吗?
【参考方案1】:
您需要两个表 users
和 admins
运行以下命令以创建内置身份验证
php artisan make:auth
两个模型用户(已经存在)和管理员
<?php
namespace App;
use Illuminate\Foundation\Auth\User as Authenticatable;
class Admin extends Authenticatable
现在打开 config/auth.php 并进行以下更改
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'admin' => [
'driver' => 'session',
'provider' => 'admins',
],
],
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => App\User::class,
],
'admins' => [
'driver' => 'eloquent',
'model' => App\Admin::class,
],
],
'passwords' => [
'users' => [
'provider' => 'users',
'email' => 'auth.emails.password',
'table' => 'password_resets',
'expire' => 60,
],
'admins' => [
'provider' => 'admins',
'email' => 'auth.emails.password',
'table' => 'password_resets',
'expire' => 60,
],
],
新建中间件RedirectIfNotAdmin
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Support\Facades\Auth;
class RedirectIfNotAdmin
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @param string|null $guard
* @return mixed
*/
public function handle($request, Closure $next, $guard = 'admin')
if (!Auth::guard($guard)->check())
return redirect('/admin/login');
return $next($request);
Kernel.php 的变化
protected $middleware = [
\Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
];
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
//\Illuminate\Session\Middleware\StartSession::class,
//\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
],
'api' => [
'throttle:60,1',
],
];
protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
'admin' => \App\Http\Middleware\RedirectIfNotAdmin::class,
];
创建一个新文件夹 Http/Controller/Adminauth 并从 Http/Controller/Auth 文件夹中复制文件
打开文件 Http/Controller/Adminauth/AuthController.php 并进行以下更改
<?php
namespace App\Http\Controllers\Adminauth;
use App\Admin;
use Validator;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\ThrottlesLogins;
use Illuminate\Foundation\Auth\AuthenticatesAndRegistersUsers;
use Auth;
class AuthController extends Controller
use AuthenticatesAndRegistersUsers, ThrottlesLogins;
protected $redirectTo = '/admin';
protected $guard = 'admin';
public function showLoginForm()
if (Auth::guard('admin')->check())
return redirect('/admin');
return view('admin.auth.login');
public function showRegistrationForm()
return view('admin.auth.register');
public function resetPassword()
return view('admin.auth.passwords.email');
public function logout()
Auth::guard('admin')->logout();
return redirect('/admin/login');
新建文件夹Http/Controller/admin,从Http/Controller/复制文件夹中的Controller.php文件
新建文件 Http/Controller/admin/employee.php
<?php
namespace App\Http\Controllers\admin;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Auth;
use App\Admin;
class Employee extends Controller
public function __construct()
$this->middleware('admin');
public function index()
return view('admin.home');
移动到资源/视图创建新文件夹资源/视图/管理 复制
resources/views/auth, resources/views/layouts & resources/views/home.blade.php
并发布到resources/views/admin
并打开 admin 文件夹中的每个文件并在每个路径前添加 admin,现在路径应该看起来像
@extends('admin.layouts.app')
你的 Http/routes.php 看起来像
<?php
Route::get('/', function ()
return view('welcome');
);
Route::get('/admin/login','Adminauth\AuthController@showLoginForm');
Route::post('/admin/login','Adminauth\AuthController@login');
Route::get('/admin/password/reset','Adminauth\PasswordController@resetPassword');
Route::group(['middleware' => ['admin']], function ()
//Login Routes...
Route::get('/admin/logout','Adminauth\AuthController@logout');
// Registration Routes...
Route::get('admin/register', 'Adminauth\AuthController@showRegistrationForm');
Route::post('admin/register', 'Adminauth\AuthController@register');
Route::get('/admin', 'Admin\Employee@index');
);
Route::group(['middleware' => 'web'], function ()
Route::auth();
Route::get('/home', 'HomeController@index');
);
就是这样,它在浏览器中打开您的网站并检查 和管理员 yoursiteurl/admin
享受....
【讨论】:
谢谢你,这太棒了,但我发现的一件事是“/admin/logout”路由被我在“web”中的“/”路由覆盖。这样它就直接重定向到“/”,而不是在“/admin/logout”中执行工作。这种行为有原因吗? 感谢您的精彩教程。唯一的问题是路由 Auth 默认用户是可见的,尽管此日志使用管理员。示例:我通过路由 admins/login 以管理员身份登录,但即使我可以看到 Laravel 默认用户的路径 /login ,反之亦然。因为我可以解决这个问题?来自智利的问候 我在调用 /admin/password/reset 时收到此错误“ResetsPasswords.php 第 252 行中的 ErrorException:App\Http\Controllers\Adminauth\PasswordController::resetPassword() 缺少参数 1” 【参考方案2】:首先,我们创建两个模型:用户和管理员
然后,我们更新 config/auth.php 文件:
return [
'defaults' => [
'guard' => 'user',
'passwords' => 'user',
],
'guards' => [
'user' => [
'driver' => 'session',
'provider' => 'user',
],
'admin' => [
'driver' => 'session',
'provider' => 'admin',
],
],
'providers' => [
'user' => [
'driver' => 'eloquent',
'model' => 'App\User',
],
'admin' => [
'driver' => 'eloquent',
'model' => 'App\Admin',
],
],
'passwords' => [
'user' => [
'provider' => 'user',
'email' => 'auth.emails.password',
'table' => 'password_resets',
'expire' => 60,
],
'admin' => [
'provider' => 'admin',
'email' => 'auth.emails.password',
'table' => 'password_resets',
'expire' => 60,
]
]
];
现在,修改 app/Http/kernel.php 文件:
protected $middleware = [
\Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class
];
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class
],
'api' => [
'throttle:60,1',
],
];
创建LoginController
并在其中设置以下代码。
注意:您必须为“用户”和“管理员”创建登录页面。然后,您必须将登录表单请求提交给适当的控制器函数,即userLogin()
或adminLogin()
。
namespace App\Http\Controllers;
use Auth, Input;
use App\User;
use App\Admin;
class LoginController extends Controller
public function userLogin()
$input = Input::all();
if(count($input) > 0)
$auth = auth()->guard('user');
$credentials = [
'email' => $input['email'],
'password' => $input['password'],
];
if ($auth->attempt($credentials))
return redirect()->action('LoginController@profile');
else
echo 'Error';
else
return view('user.login');
public function adminLogin()
$input = Input::all();
if(count($input) > 0)
$auth = auth()->guard('admin');
$credentials = [
'email' => $input['email'],
'password' => $input['password'],
];
if ($auth->attempt($credentials))
return redirect()->action('LoginController@profile');
else
echo 'Error';
else
return view('admin.login');
public function profile()
if(auth()->guard('admin')->check())
pr(auth()->guard('admin')->user()->toArray());
if(auth()->guard('user')->check())
pr(auth()->guard('user')->user()->toArray());
【讨论】:
如何在默认 AuthController 中使用多重身份验证。你能纠正我吗?我已经实现并且它对用户表工作正常,但是它从管理表验证管理员但没有为管理员创建会话。 ***.com/questions/34614753/… 我收到错误:身份验证用户提供程序 [] 未定义。auth()->guard('admin')->user()
返回 null【参考方案3】:
在大多数情况下,我只是在用户表中添加一个名为 usertype 的字段并传递适当的值,例如 0=admin、1=user 等。
这种方法有助于避免创建不同用户角色或类型带来的不必要的麻烦。
虽然这听起来可能不太理想,但有助于节省大量时间。
【讨论】:
以上是关于如何在 laravel 5.2 中使用多重身份验证 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
我正在尝试为 user 和 admin 实现 laravel 5.2 多重身份验证。但是未定义身份验证用户提供程序 [] 错误给出
laravel 4.2 如何检查是不是有用户登录多重身份验证
Laravel 5.2 需要一个实现默认身份验证驱动程序/“Multi-Auth”的示例。现在需要很多工作,因为[重复]