哨兵登录使用用户名或电子邮件(任何em)在Laravel 4


Sentry Login using username or email (any of em) in Laravel 4

目前我使用的是使用电子邮件的哨兵登录,我知道如果我简单地更改,它可以多么容易地转换为用户名

哨兵配置文件到此

'login_attribute' => 'username',

但我觉得这很奇怪,因为后来忘记密码信息的电子邮件变得无法访问。我想要的是,我想让用户在登录期间自由选择artibute作为用户名或给他们中的任何一个发电子邮件。。。。

知道怎么开始吗?

这是一种方法:

使用用户选择的任何登录字段定位用户:

$user = User::where(Input::get('login_field'), Input::get('login_name'))->first();

使用您刚刚找到的用户的电子邮件创建有效凭据:

$credentials = array(
    'email'    => $user ? $user->email : null,
    'password' => Input::get('password'),
);    

并对其进行身份验证:

$user = Sentry::authenticate($credentials, false);

首先,在数据库用户表中,应该添加username字段

在您的登录功能中,您可以通过用户名或电子邮件进行以下验证:

$username = Input::get('username');
$password = Input::get('password');
$field = filter_var($username, FILTER_VALIDATE_EMAIL) ? 'email' : 'username';
try {
    if (empty($username)) {
        throw new Cartalyst'Sentry'Users'LoginRequiredException();
    }
    if (empty($password)) {
        throw new Cartalyst'Sentry'Users'PasswordRequiredException();
    }
    $user = User::where($field, '=', $username)
        ->first();
    if (empty($user)) {
        throw new Cartalyst'Sentry'Users'UserNotFoundException();
    }
    if (!Hash::check($password, $user->password)) {
        throw new Cartalyst'Sentry'Users'WrongPasswordException();
    }
    // Authenticate the user
    Sentry::login($user, $remember);
}
catch (Cartalyst'Sentry'Users'LoginRequiredException $e) {
    ...
}
catch (Cartalyst'Sentry'Users'PasswordRequiredException $e) {
    ...
}
catch (Cartalyst'Sentry'Users'WrongPasswordException $e) {
    ...
}
catch (Cartalyst'Sentry'Users'UserNotFoundException $e) {
    ...
}
catch (Cartalyst'Sentry'Users'UserNotActivatedException $e) {
    ...
}

通过这种方式,我们只访问一次数据库中的用户信息。

希望得到帮助。