Версия Laravel: 7.x

Мне нужно разработать приложение, в котором есть 2 основных roles и несколько sub-roles, например: administrator / manager, office-admin и т. Д. И company / field-agent, front-desk. Где administrator - владелец сайта, а company - franchise.

Таблицы:

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 разных охранника. admin, staff, company и employee.

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,
    ],
],

В: Можно ли это сделать через общую страницу входа или мне нужно создать несколько страниц входа с URL-адресами?

0
MrSingh 14 Апр 2020 в 15:38

1 ответ

Лучший ответ

Я нашел решение. Вот мой последний код:

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');

    ...
}
0
MrSingh 26 Апр 2020 в 15:21