【问题标题】:Laravel 5.1 Authentication without passwordLaravel 5.1 无密码认证
【发布时间】:2015-11-30 18:45:15
【问题描述】:

我正在用 Laravel 5.1 开发一个应用程序。我需要能够仅使用电子邮件(不使用密码)登录用户。我的登录表单中有一个密码字段,因为我出于其他原因需要它,但我唯一需要检查的是用户电子邮件是否存在于我的用户表中。 我重写了 AuthController,我正在尝试使用尝试()方法,但是当我尝试使用有效的电子邮件登录时,它给了我以下错误:

EloquentUserProvider.php 第 112 行中的 ErrorException:未定义索引:密码

我如何告诉 EloquentUserProvider 我没有使用密码登录,只使用用户名(电子邮件)?

谢谢!!

【问题讨论】:

    标签: authentication laravel-5.1


    【解决方案1】:

    您可以找到带有查询的电子邮件并获得用户ID,然后

    Auth::loginUsingId(user_id);
    

    它将验证 user_id 。

    【讨论】:

      【解决方案2】:

      如果您不使用密码,您真正需要做的就是:

      $authorised = User::where('email', $email)->exists();
      

      但是,如果您想创建自己的无密码 UserProvider,您可以扩展 EloquentUserProvider 并覆盖 validateCredentials 以不检查密码,如下所示:

      use Illuminate\Contracts\Auth\Authenticatable as UserContract;
      use Illuminate\Contracts\Hashing\Hasher as HasherContract;
      use Illuminate\Auth\EloquentUserProvider;
      
      class NoPasswordUserProvider extends EloquentUserProvider {
      
      
      public function __construct(HasherContract $hasher, $model)
      {
          parent::__construct($hasher, $model);
      }
      
      /**
       * Validate a user against the given credentials.
       *
       * @param  \Illuminate\Contracts\Auth\Authenticatable  $user
       * @param  array  $credentials
       * @return bool
       */
      public function validateCredentials(UserContract $user, array $credentials)
      {
          return true;
      }
      
      }
      

      您可能还需要为其创建新的服务提供者:

      class NoPasswordUserServiceProvider extends ServiceProvider {
      
      public function boot()
      {
          Auth::extend('NoPasswordAuth', function($app)
          {
              $model = $this->app['config']['auth.model'];
              return new NoPasswordUserProvider($this->app['hash'], $model);
          });
      }
      
      /**
       * Register the service provider.
       *
       * @return void
       */
      public function register()
      {
          // TODO: Implement register() method.
      }
      }
      

      很明显,代码没有经过全面测试,但应该或多或少可以工作。

      【讨论】:

        【解决方案3】:

        我最终做的是编写自己的身份验证控制器。我还编写了自己的中间件。我之所以喜欢这个,是因为我需要在用户登录时执行更多操作。我想其他答案还可以,但是由于我在用户登录时需要其他功能,所以我决定编写自己的控制器来实现我需要的功能。 在我的 Auth 控制器中,我编写了自己的登录功能、自己的注销等.... 非常感谢您的回答!

        【讨论】:

          猜你喜欢
          • 2016-05-18
          • 1970-01-01
          • 2015-11-05
          • 2018-03-16
          • 2017-07-26
          • 1970-01-01
          • 2016-06-25
          • 2017-03-27
          • 2015-12-11
          相关资源
          最近更新 更多