1

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

哨兵配置文件到这个

'login_attribute' => 'username',

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

知道如何开始吗?

4

2 回答 2

2

这是一种方法:

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

$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);
于 2013-12-01T01:14:58.610 回答
1

首先,在数据库用户表中,您应该在其中添加用户名字段。

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

$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) {
    ...
}

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

希望这有帮助。

于 2014-08-30T04:06:12.153 回答