代码之家  ›  专栏  ›  技术社区  ›  Miguel

正在检查记录的“guard”

  •  39
  • Miguel  · 技术社区  · 10 年前

    我有一个multiauth laravel 5.2应用程序,在 config/auth.php :

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

    所以 admin user .

    问题存在于视图层,因为这两个日志保护共享一些视图,例如:

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

    在这种情况下,守卫被硬编码到视图中,以始终 管理 (当loggedin guard为 使用者

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

    PS:我知道这可以通过获取相应的url段来实现,例如: www.site.com/pt/user/dasboard 在这种情况下,它将是段2,但这样应用程序将失去可伸缩性,因为在未来相应的段可能不相同(上例中为2)

    8 回复  |  直到 6 年前
        1
  •  69
  •   tomfrio    10 年前

    name() 方法,检查当前会话使用的保护,并调用 user() 在该Guard实例上。

    另一种方法是简单地使用 if语句 在刀片模板中:

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

    然而,这有点脏。您可以通过使用partial或通过直接从Controller或ViewComposer向视图传递包含保护名称的变量,然后执行以下操作来稍微清理此问题:

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

    在您的视图中。

    伊莫,扩展Laravel的身份验证是您的最佳选择。

        2
  •  12
  •   lewis4u    5 年前

    这将获得用于当前登录用户的保护名称

    Auth::getDefaultDriver()
    

    当您登录时,默认情况下,它将为您提供:

    'web'
    

    可靠的是,您登录的卫队将为您提供卫队名称。

    这不适用于API!!!因为laravel中的API默认不使用会话。

        3
  •  11
  •   miken32 Amit D    8 年前

    由于Laravel 5.5,这很容易做到 @auth 模板指令。

    @auth("user")
        You're a user!
    @endauth
    
    @auth("admin")
        You're an administrator!
    @endauth
    
    @guest
        You're not logged in!
    @endguest
    

    参考文献: https://laravel.com/docs/5.6/blade#if-statements

        4
  •  6
  •   Harat    4 年前

    在新版laravel中使用:

    Auth::getDefaultDriver()
    

    我建议使用全局助手函数,如

    function activeGuard(){
    
    foreach(array_keys(config('auth.guards')) as $guard){
    
        if(auth()->guard($guard)->check()) return $guard;
    
    }
    return null;
    }
    
        5
  •  4
  •   Elihai David Vanunu    6 年前

    根据Harat的答案,我构建了一个类名CustomAuth,它使我能够轻松访问Auth facade方法: 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;
        }
    }
    
    
        6
  •  1
  •   Peter    5 年前

    使用 auth()->guard($guard)->getName() 将返回两种不同类型的值

    登录_管理员_59ba36添加c2b2f9401580f014c7f58ea4e30989d

    如果是管理员

    登录_web_59ba36添加c2b2f9401580f014c7f58ea4e30989d

    如果是web防护,或者根据您的用例是用户防护。因此,您可以对此进行测试。

    因此,一个简单的用例可以如下所述

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

    这里如果是管理员,它将显示 'is admin' 否则将获得默认值

        7
  •  1
  •   Mohamed Mo Kawsara    4 年前

    在我的案例中,我启动并运行了一个项目,经常使用 auth()->user() 因此,我有义务找到一种方法,在我的应用程序中使用多个防护。


    在中向您的web组添加自定义web中间件 kernel.php

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

    使用 CustomWebMiddleware.php

    <?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);
        }
    
    
    }
    
    
        8
  •  0
  •   Damilare Koiki    5 年前
    Auth::getDefaultDriver()
    

    在您的情况下(用户或管理员),以上内容将返回当前守卫