Php 在laravel中自动检测登录用户的右防护
我正在使用laravel5.4,并在我的应用程序中添加了一个名为Php 在laravel中自动检测登录用户的右防护,php,laravel,laravel-5.4,Php,Laravel,Laravel 5.4,我正在使用laravel5.4,并在我的应用程序中添加了一个名为website的新防护,我做了所有需要做的事情 但我遇到的一个问题是,default和websiteguard之间共享了一些视图。例如,当我想显示当前登录用户时,我使用了以下方法: <div class="pull-left info"> @if(Auth::guard('website')->check()) <p>{{Auth:
website
的新防护,我做了所有需要做的事情
但我遇到的一个问题是,default和website
guard之间共享了一些视图。例如,当我想显示当前登录用户时,我使用了以下方法:
<div class="pull-left info">
@if(Auth::guard('website')->check())
<p>{{Auth::guard('website')->user()->name}} Website</p>
@elseif (Auth::check())
<p>{{Auth::user()->name}}</p>
`@endif
<a href="#"><i class="fa fa-circle text-success"></i> Online</a>
</div>
在这种情况下,如果我想为默认用户登录用户存储一些横幅,我应该使用if()
或另一种存储方法:
public function store($website,StoreBannerAds $request)
{
$allData = $request->all();
if (Auth::guard('website')->check()) {
$model = Auth::guard('website')->user();
} else if (Auth::check()){
$model = Auth::user();
}
$ads = $model->banner_ads()->create($allData);
$result = ['success' => true, 'generated_id' => $ads->banner_ads_id];
return $result;
}
我想知道有没有什么干净合适的方法可以做到这一点,或者我仍然必须使用这种方法
更新:
我之前在auth.php配置文件中更改的内容如下:
'defaults' => [
'guard' => 'web',
'passwords' => 'users',
],
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'website' => [
'driver' => 'session',
'provider' => 'websites',
],
'api' => [
'driver' => 'token',
'provider' => 'users',
],
],
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => App\User::class,
],
'websites' => [
'driver' => 'eloquent',
'model' => App\Website::class,
]
],
'passwords' => [
'users' => [
'provider' => 'users',
'table' => 'password_resets',
'expire' => 60,
],
],
我不明白你的解释。但是,根据我的理解,我确实有一点解决办法。例如,使用
助手
if (! function_exists('auth_user')) {
function auth_user($guard = 'website', $attr = null, $force = false)
{
$user = auth($guard)->check()
? auth($guard)->user()
: $force && auth()->check()
? auth()->user()
: null;
return $user
? $attr
? $user->$attr
: $user
: null;
}
}
然后你可以这样使用它:
// get name of the user
$name = auth_user('website', 'name');
// get the user
$user = auth_user()
PS.如果用户未通过身份验证,您会怎么想?$model
的值是多少?你的例子很奇怪
使用这种方法,至少可以简化代码
@if ($name = auth_user('website', 'name'))
<p>{{ $name }} Website</p>
@elseif ($name = auth_user(null, 'name')) // or auth_user('website', 'name', true)
<p>{{ $name }}</p>
@endif
您只需点击默认的保护即可获得用户
Auth::user()
将使用当前的默认保护
如果在默认的auth
中间件后面总是有任何路由需要经过身份验证的用户,那么默认的保护应该是获取用户的正确保护。如果路由不在auth
中间件后面,并且用户当前是来宾,那么调用哪个警卫check
就无关紧要了
请求
对象也可以访问当前用户。不管怎样,$request->user()
都应该为您提供当前用户
在调用check
保护程序或询问AuthManager
默认保护程序时,可以检查使用了什么保护程序
一些选择:
@if (Auth::check())
{{ Auth::user()->name }}
@if (Auth::getDefaultDriver() == 'website')
Website
@endif
@endif
或
或(如果在5.5中)
把线弄细一点
$model = $request->user();
// or
$model = Auth::user();
这在逻辑上是有问题的。如果用户已经由一个保护进行了身份验证,那么您不需要进一步指定,因为它将是整个代码流的保护。如果要切换逻辑/接口,请在用户上设置类型标志。测试防护装置类型是必要的pointless@MikeMiller,这意味着如果我使用
Auth::guard('website')->validate()
登录网站用户,我就使用Auth::user()
?但是当使用它时,它返回null
值,但当使用Auth::guard('website')->user()
时,所有事情都很好是的,总是使用\Auth::user()
。您应该在配置或路由中应用防护。一旦用户进入控制器,他们就已经通过了防护。在用户身上使用一些东西来决定下一步要做什么您应该在配置或路由中应用您的防护
如何?你能给我更多的指导吗?你可以通过阅读文档来帮助自己:$model只保存当前登录的用户是的,我知道,但是你仍然使用else if(Auth::check())
。我的意思是,如果控制器只能由登录的用户访问,你不需要它,请改用else
。我试过你的代码,但是当运行@if(Auth::check())时
如果一个网站卫士用户登录,它不会做任何事情,并且看起来不等于真的。您是否使用auth
中间件?我使用auth:website
中间件处理网站用户的路由,并解决了问题。
@if (Auth::check())
{{ Auth::user()->name }}
@if (Auth::getDefaultDriver() == 'website')
Website
@endif
@endif
@if (Auth::check())
{{ Auth::user()->name }}
@if (Auth::guard('webiste')->check())
Website
@endif
@endif
@auth
{{ Auth::user()->name }}
@auth('website')
Website
@endauth
@endauth
$model = $request->user();
// or
$model = Auth::user();