任何人都可以用示例解释 Laravel 5.2 多重身份验证

Can Anyone Explain Laravel 5.2 Multi Auth with Example

我正在尝试验证 usersadmin 表单 user table 和 admin table分别。我正在使用开箱即用的 laravel 提供的 User 模型,并为 Admin. 创建了相同的模型 我在 auth.php. [=24] 中添加了保护密钥和提供商密钥=]

守卫

'guards' => [
    'user' =>[
        'driver' => 'session',
        'provider' => 'user',
    ],
    'admin' => [
        'driver' => 'session',
        'provider' => 'admin',
    ],
],  

提供商

'providers' => [
    'user' => [
        'driver' => 'eloquent',
        'model' => App\User::class,
    ],
    'admin' => [
        'driver' => 'eloquent',
        'model' => App\Admin::class,
    ]
],

路线

Route::group(['middleware' => ['web']], function () {
    // Login Routes.   
    Route::get('/admin/login','AdminAuth\AuthController@showLoginForm');
    Route::post('/admin/login','AdminAuth\AuthController@login');
    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', 'AdminController@index');
});

我创建了一个名为 AuthAdmin 的目录,其中存在 Laravel 的默认 AuthController.phpPasswordController.php 文件。 (相应地修改了命名空间)

首先,在 Laravel 的文档中提到如何在像这样进行身份验证时指定自定义保护,但这是行不通的。

Laravel 的文档中提到了另一种使用守卫的方法,但它也不起作用。

如果有人能解决问题并在我错的时候纠正我,那将是有益的。

经过大量的挖掘和大量的问题和答案,我终于设法使用两个 Laravel 5.2 Multi Auth table,所以我正在写我自己的问题的答案。

如何在Laravel 5.2

中实现多认证

如上所述。 两个 table adminusers

Laravel 5.2 有一个新的 artisan 命令。

php artisan make:auth

它将为 user table.

生成基本的 login/register routeviewcontroller

为简单起见,将 admin table 设为 users table。

管理员控制器
app/Http/Controllers/AdminAuth/AuthController
app/Http/Controllers/AdminAuth/PasswordController
(注意:我只是从 app/Http/Controllers/Auth/AuthController 复制这些文件到这里)

config/auth.php

//Authenticating guards
'guards' => [
    'user' =>[
        'driver' => 'session',
        'provider' => 'user',
    ],
    'admin' => [
        'driver' => 'session',
        'provider' => 'admin',
    ],
],  

//User Providers
'providers' => [
    'user' => [
        'driver' => 'eloquent',
        'model' => App\User::class,
    ],
    'admin' => [
        'driver' => 'eloquent',
        'model' => App\Admin::class,
    ]
],  

//Resetting Password  
'passwords' => [
    'clients' => [
        'provider' => 'client',
        'email' => 'auth.emails.password',
        'table' => 'password_resets',
        'expire' => 60,
    ],
    'admins' => [
        'provider' => 'admin',
        'email' => 'auth.emails.password',
        'table' => 'password_resets',
        'expire' => 60,
    ],
],  

route.php

Route::group(['middleware' => ['web']], function () {
    //Login Routes...
    Route::get('/admin/login','AdminAuth\AuthController@showLoginForm');
    Route::post('/admin/login','AdminAuth\AuthController@login');
    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', 'AdminController@index');

});  

AdminAuth/AuthController.php

添加两个方法并指定$redirectTo$guard

protected $redirectTo = '/admin';
protected $guard = 'admin';
public function showLoginForm()
{
    if (view()->exists('auth.authenticate')) {
        return view('auth.authenticate');
    }

    return view('admin.auth.login');
}
public function showRegistrationForm()
{
    return view('admin.auth.register');
}  

它将帮助您打开另一个管理员登录表单

正在为 admin

创建中间件
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('/');
    }

    return $next($request);
}

}

kernel.php

中注册中间件
 protected $routeMiddleware = [
    'admin' => \App\Http\Middleware\RedirectIfNotAdmin::class,
];

AdminController中使用这个中间件 例如,

中间件('admin'); } public函数索引(){ return 查看('admin.dashboard'); } } 这就是使其正常工作以及获得 json 的经过身份验证的管理员使用所需的一切 `Auth::guard('admin')->user()` **编辑 - 1** 我们可以直接使用访问经过身份验证的用户 `Auth::user()` 但是如果你有两个身份验证 table 那么你必须使用 Auth::guard('guard_name')->用户() 用于注销 Auth::guard('guard_name')->用户()->注销() 对于经过身份验证的用户 json Auth::guard('guard_name')->用户() ##编辑2 现在你可以下载Laravel 5.2 Multiauth implemented Project http://imrealashu.in/code/laravel/multi-auth-with-laravel-5-2-2/

万一这对任何人都有帮助,这可能只是由于我对中间件缺乏了解,这是我必须做的才能使它正常工作(除了@imrealashu 采取的步骤)...

route.php:

Route::get('/admin', [
  'middleware' => 'admin',
  'uses' => 'AdminController@index'
]);

这是在 web 中间件组中。在此之前,我尝试将它放在一个单独的 admin 中间件组中,甚至放在 auth:admin 组中,但这没有用,只有当我在路由本身上将中间件指定为 admin 时,它才对我有用。我不知道这是为什么,但我希望它能避免其他人像我一样拔头发。

在 laravel 5.6 中非常容易。只需转到 config/auth.php 并在 providers 数组中添加此行:

'admins' => [
   'driver' => 'database',
   'table' => 'admin_table'
]

请注意,我们使用 database 作为驱动程序而不是 eloquent

现在将其添加到 guards 数组:

'admin_guard' => [
   'driver' => 'session',
   'provider' => 'admins'
]

大功告成!与管理员一起工作时使用此 table:

Auth::guard('admin_guard')->User();

干杯。