Проверка того, какой «охранник» вошел в систему

У меня есть приложение laravel 5.2 с мультиаутентификацией, в котором следующие охранники определены на config/auth.php:

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

Итак, admin и user.

Проблема заключается в уровне представления, поскольку эти два зарегистрированных охранника имеют общие представления, например:

Hello {{Auth::guard('admin')->user()->name}}

В этом случае охранник жестко запрограммирован в представлении, чтобы всегда быть admin (он выдает ошибку, когда залогиненный охранник равен user), но, чтобы избежать необходимости делать еще один равный вид только для этого небольшого изменения, я хотел бы, чтобы он был динамическим, что-то вроде :

Hello {{Auth::guard(<LOGGEDIN GUARD>)->user()->name}}

PS: я знаю, что этого можно добиться, получив соответствующий сегмент URL-адреса, например: www.site.com/pt/user/dasboard, который в этом случае будет сегментом 2, но таким образом приложение потеряет масштабируемость, поскольку в будущем соответствующий сегмент может быть другим ( 2 в примере выше)


person Miguel    schedule 17.08.2016    source источник
comment
Посмотрите здесь в getGuard() и как это реализовано в области auth Laravel. Думайте, что это поможет вам двигаться в правильном направлении.   -  person camelCase    schedule 17.08.2016
comment
Спасибо за ответ, к сожалению, Auth::guard($this->getGuard()) вызывает Method [getGuard] does not exist. . Я предполагаю, что это функция 5.1, я также проверил stackoverflow.com/questions/35624561/ с тем же результатом   -  person Miguel    schedule 17.08.2016
comment
Правильно, поскольку вы не находитесь в классе авторизации, а метод protected, вы не можете использовать $this для доступа к нему. Но вы можете получить доступ с помощью чего-то вроде Auth::guard(Auth::getGuard()), но я не уверен.   -  person camelCase    schedule 17.08.2016
comment
тоже не получилось, ...class 'Illuminate\Auth\SessionGuard' does not have a method 'getGuard'   -  person Miguel    schedule 17.08.2016


Ответы (7)


Один из способов сделать это — расширить класс аутентификации Laravel в контейнере IoC, включив, например, метод name(), который проверяет, какой Guard используется для текущего сеанса, и вызывает user() для этого экземпляра Guard.

Другой способ — просто использовать if-statement в шаблоне Blade:

@if(Auth::guard('admin')->check())
    Hello {{Auth::guard('admin')->user()->name}}
@elseif(Auth::guard('user')->check())
    Hello {{Auth::guard('user')->user()->name}}
@endif

Однако это немного грязно. Вы можете немного почистить это, используя частичное или передав представление переменной, содержащей имя защиты, либо непосредственно из вашего контроллера, либо через ViewComposer, а затем выполните:

Hello {{Auth::guard($guardName)->user()->name}}

в вашем представлении.

Расширение аутентификации Laravel — ваш лучший вариант, имхо.

person tomfrio    schedule 17.08.2016
comment
Спасибо, но это также устранило бы масштабируемость приложения, поскольку я был бы привязан к admin/user гвардии. - person Miguel; 17.08.2016
comment
Очень верно. Вот почему расширение аутентификации Laravel — лучший вариант. - person tomfrio; 17.08.2016
comment
@tomfrio, что, если вы вошли в систему как оба? - person adam78; 26.07.2017
comment
верните меня: защита авторизации [пользователь] не определена ... но [админ] работал и возвращает false для нового пользователя без прав администратора - person saber tabatabaee yazdi; 01.10.2019


Это позволит получить имя охранника, которое используется для текущего вошедшего в систему пользователя.

Auth::getDefaultDriver()

Когда вы войдете в систему, по умолчанию вы получите:

'web'

В зависимости от того, через какого охранника вы вошли в систему, вы получите это имя охранника.

Это не относится к API!!! Поскольку API в laravel по умолчанию не используют сеанс.

person lewis4u    schedule 31.10.2019
comment
Auth::getDefaultDriver() — get $this-›app['config']['auth.defaults.guard']; это всегда должно быть значение конфигурации - person Shiro; 29.10.2020
comment
Нет, если у вас их несколько и они используются динамически... с этим ^ вы получите значение по умолчанию, которое жестко запрограммировано в файле config.auth - person lewis4u; 29.10.2020
comment
Это драйвер по умолчанию из конфигурации, а не тот, который используется для текущего зарегистрированного пользователя. - person Mladen Janjetovic; 17.06.2021

Я рекомендую использовать глобальную вспомогательную функцию, например

function activeGuard(){

foreach(array_keys(config('auth.guards')) as $guard){

    if(auth()->guard($guard)->check()) return $guard;

}
return null;
}
person Harat    schedule 04.11.2019

В зависимости от ответа Харата я создал имена классов CustomAuth, и это дает мне легкий доступ к методам фасада Auth: user() и id().

<?php

namespace App\Utils;

use Illuminate\Support\Facades\Auth;

class CustomAuth{
    static public function user(){
        return Auth::guard(static::activeGuard())->user() ?: null;
    }

    static public function id(){
        return static::user()->MID ?: null;
    }

    static private function activeGuard(){

        foreach(array_keys(config('auth.guards')) as $guard){

            if(auth()->guard($guard)->check()) return $guard;

        }
        return null;
    }
}

person Elihai David Vanunu    schedule 02.12.2019

использование auth()->guard($guard)->getName() вернет два разных типа значений

login_admin_59ba36addc2b2f9401580f014c7f58ea4e30989d

если администратор охранник

login_web_59ba36addc2b2f9401580f014c7f58ea4e30989d

если это веб-защита или, в зависимости от вашего варианта использования, защита пользователя. Таким образом, вы можете проверить против этого.

поэтому простой вариант использования может быть таким, как указано ниже

 if(str_contains(auth()->guard($guard)->getName(), 'admin')){
      dd('is admin');
   }

здесь, если это администратор, он покажет 'is admin', иначе вы получите значение по умолчанию

person Peter    schedule 11.02.2021

Auth::getDefaultDriver()

Выше будет возвращен текущий охранник, в вашем случае (пользователь или администратор)

person Koiki Damilare    schedule 03.08.2021