【问题标题】:Laravel 5.2 Auth facade and Auth::guard($guard)Laravel 5.2 Auth 外观和 Auth::guard($guard)
【发布时间】:2016-09-07 08:44:40
【问题描述】:

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

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

检查用户是否是客人。

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

Auth::check()

确定用户是否经过身份验证。 (我认为这与 guest() 相反?

我尝试更改要使用的默认代码

Auth::guest()

我得到完全相同的结果。

我的问题是,在这种情况下是否有 guard($guard)-> 有什么区别?

一个相关的问题。 guest() 是否与 check() 完全相反,或者在某些情况下它们可能会返回相同的结果?

谢谢!

【问题讨论】:

    标签: php laravel authentication


    【解决方案1】:

    没有区别 - 如果您检查 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();
    }
    

    【讨论】:

    • 谢谢,但是guard($guard) 的目的是什么?
    【解决方案2】:

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

    如果未指定,则 Auth 外观默认使用 'web' 保护。例如:Auth::user() 默认情况下这样做:Auth::guard('web')->user()

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

    这将检查用户是否通过 api_token 而不是会话进行身份验证。然后你可以通过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

    【讨论】:

    【解决方案3】:

    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 选择 guest() 或 check() 方法。 如果您使用过 Auth:check() 和 Auth::guest() 但它只显示相同的结果。也许你在 login() 中设置了 attemp 方法,如下面的代码

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

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

    【讨论】:

      猜你喜欢
      • 2016-07-30
      • 2017-01-06
      • 1970-01-01
      • 2020-04-22
      • 2016-03-11
      • 2017-07-16
      • 2021-10-28
      • 1970-01-01
      • 2021-10-24
      相关资源
      最近更新 更多