使用用户名的 Laravel 身份验证不区分大小写

Posted

技术标签:

【中文标题】使用用户名的 Laravel 身份验证不区分大小写【英文标题】:Laravel authentication with username is case insensitive 【发布时间】:2020-08-09 17:53:42 【问题描述】:

我正在使用 Laravel 手动身份验证,我需要区分大小写的用户名检查,但 laravel 默认情况下有不区分大小写的检查,我在文档中找不到如何更改它。是否有一些简单的方法或者我需要编写自己的身份验证?

这是我的控制器

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

class AuthController extends Controller

    /**
     * Handle an authentication attempt.
     *
     * @param  \Illuminate\Http\Request $request
     *
     * @return Response
     */
    public function authenticate(Request $request)
    
        $credentials = $request->only('username', 'password');

        if (Auth::attempt($credentials)) 

            return redirect()->intended('dashboard');
        
        return redirect()->intended('login');
    

【问题讨论】:

【参考方案1】:

不区分大小写的匹配不是来自 Laravel 本身,而是来自您的数据库,该数据库(在大多数情况下)使用不区分大小写的排序规则来存储用户名。您可以将迁移更改为例如:

 public function up()
    
        Schema::create('users', function (Blueprint $table) 
            $table->id();
            $table->string('name');
            $table->string('email')->unique()->collation('utf8_bin');
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
        );
    

这将使用不区分大小写的utf8_bin 排序规则对电子邮件列进行排序。但是,该集合将影响列的排序,因此如果您使用不明确顺序的 UTF8 字符,任何使用 ORDER BY email 的查询都可能返回不同的顺序。如果这是只能使用 ASCII 字符的电子邮件或用户名,这不是问题。

【讨论】:

以上是关于使用用户名的 Laravel 身份验证不区分大小写的主要内容,如果未能解决你的问题,请参考以下文章

使 Laravel 的 notIn 验证规则不区分大小写

MySQL LIKE 区分大小写,但我不希望它是 [重复]

强制 Laravel 使用旧版身份验证登录用户

Laravel 在不破坏身份验证的情况下加密用户电子邮件

如何使用另一个 API 的用户群在 laravel 中设置身份验证?

获取经过身份验证的用户 Laravel/Lumen Passport