检查登录的“警卫”

时间:2016-08-17 14:40:33

标签: laravel laravel-5.2

我有一个multiauth laravel 5.2应用程序,在config/auth.php定义了快速防护:

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

所以,adminuser

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

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

在这种情况下,后卫被硬编码到视图中总是admin(当登录后卫user时它会出错),但是,为了避免必须为此做另一个相同的视图改变,我希望它有动摇,类似:

Hello {{Auth::guard(<LOGGEDIN GUARD>)->user()->name}}
PS:我知道这可以通过获得相应的url段来实现,例如www.site.com/pt/user/dasboard,在这种情况下它将是第2段,但这样app会失去可扩展性,因为将来相应的段可能不相同(上例中为2)

7 个答案:

答案 0 :(得分:28)

执行此操作的一种方法是在IoC容器中扩展Laravel身份验证类,以包括一个name()方法,该方法检查当前会话使用哪个保护,并调用user()在那个Guard实例上。

另一种方法是在您的Blade模板中简单地使用 if-statement

@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的身份验证是最好的选择,imo。

答案 1 :(得分:4)

从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

答案 2 :(得分:2)

我建议使用像这样的全局帮助器功能

function activeGuard(){

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

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

}
return null;
}

答案 3 :(得分:1)

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

Auth::getDefaultDriver()

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

'web'

根据您登录的守卫,它会为您提供该守卫的名字。

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

答案 4 :(得分:1)

根据Harat的回答,我建立了一个类名称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;
    }
}

答案 5 :(得分:1)

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

<块引用>

login_admin_59ba36addc2b2f9401580f014c7f58ea4e30989d

如果是管理员

<块引用>

login_web_59ba36addc2b2f9401580f014c7f58ea4e30989d

if 是网络守卫还是用户守卫取决于您的用例。所以你可以对此进行测试。

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

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

这里如果是管理员,它会显示 'is admin' 否则你会得到默认

答案 6 :(得分:0)

Auth::getDefaultDriver()

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