我正在开发Laravel 5.1中的应用程序。我需要能够仅使用电子邮件登录用户(不使用密码)。我的登录表单中有一个密码字段,因为我出于其他原因需要它,但我唯一要检查的是用户电子邮件存在于我的用户表中。 我重写了AuthController,我正在尝试使用attempt()方法,但是当我尝试使用有效的电子邮件登录时,它会给我以下错误:
EloquentUserProvider.php第112行中的ErrorException:未定义索引:密码
我如何告诉EloquentUserProvider我没有使用密码登录,只有用户名(电子邮件)?
谢谢!
答案 0 :(得分:5)
您可以找到包含查询的电子邮件,并且ID为user,然后
Auth::loginUsingId(user-id);
它将验证用户ID。
答案 1 :(得分:3)
如果您没有使用密码,那么您真正需要做的就是:
$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.
}
}
显然,代码尚未经过全面测试,但应该或多或少有效。
答案 2 :(得分:1)
我最终做的是编写自己的Auth Controller。我也写了自己的中间件。我之所以喜欢这样,是因为我需要在用户登录时执行更多操作。我想其他答案都没问题但是因为我需要其他功能而用户登录时我决定编写自己的控制器来实现我需要的功能。 在我的Auth控制器中,我编写了自己的登录功能,我自己的注销等等.... 非常感谢你的答案!