检查登录的"警卫"

Mig*_*uel 19 php laravel laravel-5 laravel-blade laravel-authentication

我有一个multiauth laravel 5.2应用程序,其中定义了config/auth.php以下警告:

...
'admin' => [
    'driver' => 'session',
    'provider' => 'admin',
],
'user' => [
    'driver' => 'session',
    'provider' => 'user',
],
...
Run Code Online (Sandbox Code Playgroud)

所以,adminuser.

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

Hello {{Auth::guard('admin')->user()->name}}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,守卫被硬编码到视图中总是admin(当登录后卫时它会给出错误user),但是,为了避免为了这个小改变而必须做另一个相同的视图,我想让它具有动态,例如:

Hello {{Auth::guard(<LOGGEDIN GUARD>)->user()->name}}
Run Code Online (Sandbox Code Playgroud)

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

小智 33

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

另一种方法是在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
Run Code Online (Sandbox Code Playgroud)

但是,这有点脏.您可以通过使用partial或者通过直接从Controller或ViewComposer传递视图包含保护名称的变量来清理它,然后执行以下操作:

Hello {{Auth::guard($guardName)->user()->name}}
Run Code Online (Sandbox Code Playgroud)

在你的视图中.

扩展Laravel的身份验证是您的最佳选择,imo.


lew*_*s4u 8

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

Auth::getDefaultDriver()
Run Code Online (Sandbox Code Playgroud)

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

'web'
Run Code Online (Sandbox Code Playgroud)

可靠地通过哪个守卫登录它会给你那个守卫名字。

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

  • 这是配置中的默认驱动程序,而不是用于当前登录用户的驱动程序 (3认同)
  • Auth::getDefaultDriver() 是 get $this-&gt;app['config']['auth.defaults.guard']; 它应该始终是配置值 (2认同)
  • 如果您有多个并且动态使用,则不会...这样 ^ 您将获得硬编码在 config.auth 文件中的默认值 (2认同)

mik*_*n32 5

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

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

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

@guest
    You're not logged in!
@endguest
Run Code Online (Sandbox Code Playgroud)

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


Har*_*rat 5

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

function activeGuard(){

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

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

}
return null;
}
Run Code Online (Sandbox Code Playgroud)