【问题标题】: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 控制器中,我编写了自己的登录功能、自己的注销等....
非常感谢您的回答!