36

我有一个 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,但是这样应用程序将失去可伸缩性,因为将来相应的段可能不一样(2在上面的例子中)

4

8 回答 8

64

一种方法是在 IoC 容器中扩展 Laravel 身份验证类,以包括例如name()检查当前会话使用哪个守卫并调用user()该守卫实例的方法。

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

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

于 2016-08-17T16:41:43.670 回答
11

@auth从 Laravel 5.5 开始,使用模板指令很容易做到这一点。

@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

于 2018-06-29T18:34:29.950 回答
10

这将获得用于当前登录用户的警卫名称

Auth::getDefaultDriver()

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

'web'

可靠的是,您通过哪个守卫登录它会为您提供该守卫名称。

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

于 2019-10-31T08:14:19.880 回答
5

我建议使用全局辅助功能,例如

function activeGuard(){

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

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

}
return null;
}
于 2019-11-04T13:44:23.387 回答
4

取决于 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;
    }
}

于 2019-12-02T20:01:52.013 回答
1

在我的情况下,我已经启动并运行了经常使用的项目,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);
    }


}

于 2021-09-24T16:06:50.937 回答
1

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

login_admin_59ba36addc2b2f9401580f014c7f58ea4e30989d

如果是管理员守卫

login_web_59ba36addc2b2f9401580f014c7f58ea4e30989d

if 是 web 警卫,或者根据您的用例是用户警卫。因此,您可以对此进行测试。

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

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

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

于 2021-02-11T12:58:38.527 回答
0
Auth::getDefaultDriver()

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

于 2021-08-03T12:23:32.027 回答