使用 Fortify Laravel 8 使用电子邮件或用户名登录
Login with either email or username with Fortify Laravel 8
我正在尝试允许用户使用电子邮件或用户名及其密码登录。
我在 FortifyServiceProvider.php 的 boot() 中添加了以下代码:
Fortify::authenticateUsing(function (Request $request) {
$user = User::where('email', $request->email)
->orWhere('username', $request->username)
->first();
if ($user &&
Hash::check($request->password, $user->password)) {
return $user;
}
});
但是现在,当用户尝试通过输入用户名而不是电子邮件登录时,他们会收到以下错误消息:
These credentials do not match our records.
我忘记更改以下行:
->orWhere('username', $request->username)
收件人:
->orWhere('username', $request->email)
因为我的登录表单中只有一个字段可以保存电子邮件或用户名。该字段的名称是 'email'.
很好的答案,效果很好!
对于使用 Vue.js 的用户:
确保在 Login.vue (resources/js/Pages/Auth/) 中将 'email' 输入的 'type' 属性从 'email' 更改为'text' (type="text"
),否则您将收到验证错误。同时将标签值更改为“用户名或电子邮件”。
确保 'Register.vue' 和 'UpdateProfileInformation.vue' (resources/js/Pages/Profile) 在模板中输入 'Username' 并在脚本数据中输入 username: this.user.username
表格.
确保 'CreateNewUser.php' 和 'UpdateUserProfileInformation.php' (app/Actions/Fortify/) 方法包含此字段(使用 'unique' 规则)。
确保 'User' 模型有一个字段 'username'(唯一的,与关联的数据库迁移)。
首先如自定义用户身份验证文档中所述
public function boot()
{
Fortify::authenticateUsing(function (Request $request) {
$user = User::where('email', $request->email)->first();
if ($user &&
Hash::check($request->password, $user->password)) {
return $user;
}
});
// ...
}
过滤您的请求:
$username = filter_var($request->email, FILTER_VALIDATE_EMAIL) ? 'email' : 'name';
Fortify::authenticateUsing(function (Request $request) {
$username = filter_var($request->email, FILTER_VALIDATE_EMAIL) ? 'email' : 'name';
$user = User::where($username, $request->email)
->first();
if (
$user &&
Hash::check($request->password, $user->password)
) {
return $user;
}
});
我正在尝试允许用户使用电子邮件或用户名及其密码登录。
我在 FortifyServiceProvider.php 的 boot() 中添加了以下代码:
Fortify::authenticateUsing(function (Request $request) {
$user = User::where('email', $request->email)
->orWhere('username', $request->username)
->first();
if ($user &&
Hash::check($request->password, $user->password)) {
return $user;
}
});
但是现在,当用户尝试通过输入用户名而不是电子邮件登录时,他们会收到以下错误消息:
These credentials do not match our records.
我忘记更改以下行:
->orWhere('username', $request->username)
收件人:
->orWhere('username', $request->email)
因为我的登录表单中只有一个字段可以保存电子邮件或用户名。该字段的名称是 'email'.
很好的答案,效果很好!
对于使用 Vue.js 的用户:
确保在 Login.vue (resources/js/Pages/Auth/) 中将 'email' 输入的 'type' 属性从 'email' 更改为'text' (
type="text"
),否则您将收到验证错误。同时将标签值更改为“用户名或电子邮件”。确保 'Register.vue' 和 'UpdateProfileInformation.vue' (resources/js/Pages/Profile) 在模板中输入 'Username' 并在脚本数据中输入
username: this.user.username
表格.确保 'CreateNewUser.php' 和 'UpdateUserProfileInformation.php' (app/Actions/Fortify/) 方法包含此字段(使用 'unique' 规则)。
确保 'User' 模型有一个字段 'username'(唯一的,与关联的数据库迁移)。
首先如自定义用户身份验证文档中所述
public function boot()
{
Fortify::authenticateUsing(function (Request $request) {
$user = User::where('email', $request->email)->first();
if ($user &&
Hash::check($request->password, $user->password)) {
return $user;
}
});
// ...
}
过滤您的请求:
$username = filter_var($request->email, FILTER_VALIDATE_EMAIL) ? 'email' : 'name';
Fortify::authenticateUsing(function (Request $request) {
$username = filter_var($request->email, FILTER_VALIDATE_EMAIL) ? 'email' : 'name';
$user = User::where($username, $request->email)
->first();
if (
$user &&
Hash::check($request->password, $user->password)
) {
return $user;
}
});