Prüfen, welcher `Wächter` eingeloggt ist

Lesezeit: 6 Minuten

Benutzer-Avatar
Miguel

Ich habe eine Multiauth-Laravel-5.2-App, in der die folgenden Wachen definiert sind config/auth.php:

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

So, admin und user.

Das Problem liegt in der Ansichtsebene, da diese beiden eingeloggten Wachen einige Ansichten teilen, z.

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

In diesem Fall ist der Wächter in der Ansicht fest codiert, immer zu sein admin (Es gibt einen Fehler, wenn der eingeloggte Wächter ist user), aber um zu vermeiden, nur für diese kleine Änderung eine weitere gleiche Ansicht machen zu müssen, hätte ich es gerne dynamisch, so etwas wie:

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

PS: Ich weiß, dass dies erreicht werden könnte, indem man das entsprechende URL-Segment erhält, z. www.site.com/pt/user/dasboard was in dem Fall Segment 2 wäre, aber auf diese Weise würde die App die Skalierbarkeit verlieren, da das entsprechende Segment in Zukunft möglicherweise nicht dasselbe ist (2 im obigen Beispiel)

  • Guck mal hier bei getGuard() und wie es in Laravel implementiert ist auth Bereich. Denke, das bringt dich in die richtige Richtung.

    – camelCase

    17. August 2016 um 15:01 Uhr

  • Danke für die Antwort, leider Auth::guard($this->getGuard()) löst aus Method [getGuard] does not exist. . Ich denke, es ist eine 5.1-Funktion, ich habe auch stackoverflow.com/questions/35624561/… mit dem gleichen Ergebnis überprüft

    – Miguel

    17. August 2016 um 15:11 Uhr

  • Richtig, da Sie nicht in der Klasse auth sind und die Methode ist protectedkönnen Sie nicht verwenden $this um darauf zuzugreifen. Aber Sie könnten vielleicht mit so etwas zugreifen Auth::guard(Auth::getGuard()) aber ich bin nicht positiv.

    – camelCase

    17. August 2016 um 16:03 Uhr

  • ging auch nicht, ...class 'Illuminate\Auth\SessionGuard' does not have a method 'getGuard'

    – Miguel

    17. August 2016 um 16:44 Uhr


Eine Möglichkeit, dies zu tun, besteht darin, die Laravel-Authentifizierungsklasse im IoC-Container zu erweitern, um beispielsweise a name() Methode, die prüft, welcher Wächter für die aktuelle Sitzung verwendet wird, und ruft auf user() auf dieser Guard-Instanz.

Eine andere Möglichkeit besteht darin, einfach an zu verwenden if-Anweisung in Ihrer Blade-Vorlage:

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

Allerdings ist dieser etwas unsauber. Sie können dies ein wenig aufräumen, indem Sie einen Teil verwenden oder der Ansicht eine Variable übergeben, die den Wächternamen enthält, entweder direkt von Ihrem Controller oder über einen ViewComposer, und dann Folgendes tun:

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

in Ihrer Ansicht.

Das Erweitern der Authentifizierung von Laravel ist imo die beste Option.

  • Danke, aber das würde auch die Skalierbarkeit aus der App entfernen, da ich auf die festgelegt wäre admin/user bewachen

    – Miguel

    17. August 2016 um 16:43 Uhr

  • Sehr richtig. Deshalb ist hier die Erweiterung der Laravel-Authentifizierung die bessere Option.

    – Tomfrio

    17. August 2016 um 17:33 Uhr

  • @tomfrio Was ist, wenn Sie als beide angemeldet sind?

    – adam78

    26. Juli 2017 um 8:33 Uhr

  • gib mir zurück: auth guard [user] ist nicht definiert … aber [admin] funktioniert und gibt false für neue Benutzer ohne Administrator zurück

    – Säbel tabatabaee yazdi

    1. Oktober 2019 um 10:27 Uhr

Seit Laravel 5.5 geht das ganz einfach mit dem @auth Vorlagenrichtlinie.

@auth("user")
    You're a user!
@endauth

@auth("admin")
    You're an administrator!
@endauth

@guest
    You're not logged in!
@endguest

Bezug: https://laravel.com/docs/5.6/blade#if-statements

  • Ich habe es mit Ihrer Antwort versucht, aber wenn ich mich mit auth (‘admin’) anmelde, wird der Inhalt des Administrators angezeigt, aber es wird immer noch der Inhalt des Gasts angezeigt. Ich weiß nicht warum?!

    – der Manh Nguyen

    19. November 2018 um 10:56 Uhr

Benutzer-Avatar
lewis4u

Dadurch wird der Wächtername abgerufen, der für den aktuell angemeldeten Benutzer verwendet wird

Auth::getDefaultDriver()

Wenn Sie sich anmelden, erhalten Sie standardmäßig Folgendes:

'web'

Je nachdem, bei welchem ​​Wächter Sie angemeldet sind, erhalten Sie diesen Wächternamen.

Dies gilt nicht für APIs!!! Weil APIs in Laravel standardmäßig keine Session verwenden.

  • Auth::getDefaultDriver() ist get $this->app[‘config’][‘auth.defaults.guard’]; es sollte immer der Konfigurationswert sein

    – Schiro

    29. Oktober 2020 um 15:40 Uhr

  • Nicht, wenn Sie mehrere haben und dynamisch verwendet werden … damit ^ erhalten Sie die Standardeinstellung, die in der Datei config.auth fest codiert ist

    – lewis4u

    29. Oktober 2020 um 15:42 Uhr

  • Dies ist der Standardtreiber aus der Konfiguration, nicht derjenige, der für den aktuell angemeldeten Benutzer verwendet wird

    – Mladen Janjetović

    17. Juni 2021 um 20:18 Uhr

Benutzer-Avatar
Harat

In neuen Versionen von Laravel verwenden Sie:

Auth::getDefaultDriver()

Ich empfehle die Verwendung globaler Hilfsfunktionen wie

function activeGuard(){

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

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

}
return null;
}

Abhängig von der Antwort von Harat habe ich einen Klassennamen CustomAuth erstellt, der mir einen einfachen Zugriff auf Auth-Fassadenmethoden ermöglicht: user() und 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;
    }
}

verwenden auth()->guard($guard)->getName() gibt zwei verschiedene Arten von Werten zurück

login_admin_59ba36addc2b2f9401580f014c7f58ea4e30989d

wenn es sich um einen Admin-Wächter handelt

login_web_59ba36addc2b2f9401580f014c7f58ea4e30989d

ob es sich um einen Web-Wächter oder je nach Anwendungsfall um einen Benutzer-Wächter handelt. Dagegen kannst du also testen.

Ein einfacher Anwendungsfall kann also wie unten angegeben aussehen

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

Hier wird angezeigt, ob es sich um einen Administrator handelt 'is admin' andernfalls erhalten Sie die Standardeinstellung

Benutzer-Avatar
Mo Kawsara

In meinem Fall hatte ich ein laufendes Projekt mit zu oft Nutzung von auth()->user() Daher war ich verpflichtet, einen Weg zu finden, um weiterhin mehrere Wächter in meiner App zu verwenden.


Verwenden Sie eine Middleware, um das Überschreiben des Werts des Standardwächters zu handhaben.

Fügen Sie Ihrer Webgruppe darin eine benutzerdefinierte Web-Middleware hinzu kernel.php

protected $middlewareGroups = [
        'web' => [
            .....
            //This cool guy here
            \App\Http\Middleware\CustomWebMiddleware::class,
        ],

Verwenden CustomWebMiddleware.php Inhalt:

<?php

namespace App\Http\Middleware;


use Closure;

class CustomWebMiddleware
{

    public function handle($request, Closure $next)
    {
        $customGuard = 'custom-guard-name-goes-here';
        if (auth($customGuard)->check()) {
            config()->set('auth.defaults.guard', $customGuard);
        }

        // if you have multiple guards you may use this foreach to ease your work.
        /*$guards = config('auth.guards');
        foreach ($guards as $guardName => $guard) {
            if ($guard['driver'] == 'session' && auth($guardName)->check()) {
                config()->set('auth.defaults.guard', $guardName);
            }
        }*/

        return $next($request);
    }


}

1240680cookie-checkPrüfen, welcher `Wächter` eingeloggt ist

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy