Laravel:带有通用登录页面的多重身份验证

时间:2020-04-14 12:38:24

标签: laravel authentication

Laravel版本:7.x

我需要开发一个应用程序,其中有两个主要的roles和多个sub-roles,例如:administrator / manageroffice-admin等。和company / field-agentfront-desk。其中administrator是网站所有者,companyfranchise

表格:

users         ->        user_staff
|- id                   |- id
|- email                |- user_id
|- password             |- email
|- ...                  |- password
                        |- ...

companies     ->        employees
|- id                   |- id
|- email                |- company_id
|- password             |- email
|- ...                  |- password
                        |- ...

登录后,他们都会进入具有各自http://www.sitename.com/admin/限制的公共管理区域(role)。

为了管理这种情况,我创建了4个不同的警卫。 adminstaffcompanyemployee

Auth.php

'guards' => [
    'admin' => [
        'driver'   => 'session',
        'provider' => 'users',
    ],
    'staff' => [
        'driver'   => 'session',
        'provider' => 'staff',
    ],
    'company' => [
        'driver'   => 'session',
        'provider' => 'company',
    ],
    'employee' => [
        'driver'   => 'session',
        'provider' => 'employee',
    ],
],
'providers' => [
    'admin' => [
        'driver' => 'eloquent',
        'model'  => App\User::class,
    ],
    'staff' => [
        'driver' => 'eloquent',
        'model'  => App\UserStaff::class,
    ],
    'company' => [
        'driver' => 'eloquent',
        'model'  => App\Company::class,
    ],
    'employee' => [
        'driver' => 'eloquent',
        'model'  => App\Employee::class,
    ],
],

问:可以通过一个通用的登录页面完成此操作,还是必须使用网址创建多个登录页面?

1 个答案:

答案 0 :(得分:0)

我找到了解决方案。这是我的最终代码:

LoginController.php

public function login()
{
    # validating posted data
    $auth = $this->validator(request()->all())->validate();
    $success = false;

    # validating credentials
    foreach ([ 'admin', 'staff', 'company', 'employee' ] as $key => $guard)
    {
        if(\Auth::guard($guard)->attempt($auth, false))
        {
            $success = true;
            break;
        }
    }

    # redirecting with error(s)
    if($success == false)
        return redirect()
            ->route('admin.login')
            ->withInput()
            ->with('error', config('messages.auth.login.failed.message'));

    # redirecting to intended page
    return redirect()->route('admin.dashboard');
}

Controller.php

public function __construct()
{
    /**
     * Middleware(s)
     */
    $this->middleware('auth:admin,staff,company,employee');

    ...
}