目前我正在使用使用电子邮件的哨兵登录,我知道如果我简单地更改它可以很容易地转换为用户名
哨兵配置文件到这个
'login_attribute' => 'username',
但我觉得这很奇怪,因为那时忘记密码信息的电子邮件变得无法访问。我想要的是,我想让用户在登录期间自由选择artibute作为用户名或通过电子邮件发送其中任何一个......
知道如何开始吗?
目前我正在使用使用电子邮件的哨兵登录,我知道如果我简单地更改它可以很容易地转换为用户名
哨兵配置文件到这个
'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 = 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) {
...
}
通过这种方式,我们只访问一次数据库以获取用户信息。
希望这有帮助。