Laravel 5.2 Auth门面和Auth :: guard($ guard)

时间:2016-05-11 19:03:29

标签: php laravel authentication

我是Laravel的新手。我正在浏览默认的身份验证中间件,我发现它正在使用:

Auth::guard($guard)->guest()

检查用户是否是来宾。

https://laravel.com/docs/5.2/authentication#retrieving-the-authenticated-user处的文档告诉我们可以使用:

Auth::check()

确定用户是否经过身份验证。 (我想这是客人()的对面吗?

我尝试更改默认代码以使用

Auth::guest()

我得到了完全相同的结果。

我的问题是,在这种情况下,后卫($ guard) - > 之间的区别是什么?

相关问题。 guest()是否与check()完全相反,或者是否存在可能返回相同结果的情况?

谢谢!

3 个答案:

答案 0 :(得分:13)

身份验证中间件允许您指定要使用的auth guard类型。 Laravel 5.2有两个开箱即用,'web''api'

如果没有指定,Auth Facade默认使用'web'保护。例如:Auth::user()默认情况下执行此操作:Auth::guard('web')->user()

开箱即用的另一个auth驱动程序名为'api'。例如,您可以像这样调用您的中间件:$this->middleware('auth:api');

这将检查用户是否通过api_token而不是session进行身份验证。然后,您可以按Auth::guard('api')->user()而不是Auth::user()获取用户的实例,该实例与Auth::guard('web')->user()

相同

如果您的应用程序仅允许登录用户使用API​​端点,则可以使用此选项。然后用户可以发出像yourapp.com/api-method?api_token=blahblah这样的请求。然后,您可以使用'api'auth guard进行身份验证并获取登录用户。

我发现本教程在设置时非常有用:http://learninglaravel.net/multiple-authentication-guard-drivers-including-api-in-laravel-52

回答你的第二个问题。是的guest()与check()正好相反。看看laravel \ framework \ src \ Illuminate \ Auth \ GuardHelpers.php

答案 1 :(得分:2)

没有区别 - 如果你检查Auth门面,你会看到Auth::guest()Auth::guard($guard)->guest()的简写。 Auth::check()是:

/**
 * Determine if the current user is authenticated.
 *
 * @return bool
 */
public function check()
{
    return ! is_null($this->user());
}

Auth::guest()Auth::check()

的对立面
/**
 * Determine if the current user is a guest.
 *
 * @return bool
 */
public function guest()
{
    return ! $this->check();
}

答案 2 :(得分:0)

Firstable我想向您展示Auth :: guard() - > guest()是如何工作的。

/**
 * Attempt to get the guard from the local cache.
 *
 * @param  string  $name
 * @return \Illuminate\Contracts\Auth\Guard|\Illuminate\Contracts\Auth\StatefulGuard
 */ 

public function guard($name = null)
{
    $name = $name ?: $this->getDefaultDriver();

    return isset($this->guards[$name])
                ? $this->guards[$name]
                : $this->guards[$name] = $this->resolve($name);
}

guard方法将返回\ Illuminate \ Contracts \ Auth \ Guard或\ Illuminate \ Contracts \ Auth \ StatefulGuard这是两种类型的接口,它将帮助laravel select guest()或check()方法。 如果您使用过Auth:check()和Auth :: guest(),但它只显示相同的Result。也许你在login()中设置了尝试方法,如下面的代码

Auth::attempt(['email'=>$email,'password'=>$password],$rememberMe,true)

你只需要删除真正的参数,它会像你想要的那样返回正确的值