我有一个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}}
在这种情况下,后卫被硬编码到视图中总是admin
(当登录后卫user
时它会出错),但是,为了避免必须为此做另一个相同的视图改变,我希望它有动摇,类似:
Hello {{Auth::guard(<LOGGEDIN GUARD>)->user()->name}}
PS:我知道这可以通过获得相应的url段来实现,例如www.site.com/pt/user/dasboard
,在这种情况下它将是第2段,但这样app会失去可扩展性,因为将来相应的段可能不相同(上例中为2)
答案 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
答案 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()
以上将返回当前的守卫,在你的情况下(用户或管理员)