Laravel 8 注册成功但登录失败:使用用户名进行身份验证的配置指南

花韻仙語
发布: 2025-10-07 13:25:27
原创
732人浏览过

laravel 8 注册成功但登录失败:使用用户名进行身份验证的配置指南

本文档旨在解决 Laravel 8 项目中注册功能正常,但登录功能失效的问题。通常,这是由于 Laravel 默认使用 email 进行身份验证,而项目配置为使用用户名或其他字段。本文将提供详细步骤,指导您如何配置 Laravel 使用用户名进行登录,并附带示例代码和注意事项,确保您的身份验证流程正确无误。

在 Laravel 中,默认情况下,身份验证系统使用 email 字段作为用户的唯一标识符进行登录。如果你的应用使用 username 或其他字段,你需要进行一些额外的配置才能正确地验证用户身份。以下是详细的配置步骤:

1. 重写 LoginController 中的 username() 方法

首先,我们需要修改 LoginController.php 文件,重写 username() 方法。这个方法告诉 Laravel 身份验证系统,应该使用哪个字段来查找用户。

打开 app/Http/Controllers/Auth/LoginController.php 文件,并添加以下代码:

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use App\Providers\RouteServiceProvider;
use Illuminate\Foundation\Auth\AuthenticatesUsers;

class LoginController extends Controller
{
    /*
    |--------------------------------------------------------------------------
    | Login Controller
    |--------------------------------------------------------------------------
    |
    | This controller handles authenticating users for the application and
    | redirecting them to your home screen. The controller uses a trait
    | to conveniently provide its functionality to your applications.
    |
    */

    use AuthenticatesUsers;

    /**
     * Where to redirect users after login.
     *
     * @var string
     */
    protected $redirectTo = RouteServiceProvider::HOME;

    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('guest')->except('logout');
    }

    /**
     * Get the login username to be used by the controller.
     *
     * @return string
     */
    public function username()
    {
        return 'username';
    }
}
登录后复制

这段代码的关键在于 username() 方法的添加。 return 'username'; 这行代码告诉 Laravel 使用 username 字段进行身份验证。

2. 确保 User 模型中没有 email 验证规则

如果你的 User 模型中存在与 email 相关的验证规则,你需要确保它们不会干扰到使用 username 进行身份验证。检查 app/Models/User.php 文件,确认 fillable 属性中包含 username,并且没有强制要求 email 字段。

Pixie.haus
Pixie.haus

AI像素图像生成平台

Pixie.haus 561
查看详情 Pixie.haus
namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Sanctum\HasApiTokens;

class User extends Authenticatable
{
    use HasApiTokens, HasFactory, Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var string[]
     */
    protected $fillable = [
        'username',
        'password',
        'role'
    ];

    /**
     * The attributes that should be hidden for serialization.
     *
     * @var array
     */
    protected $hidden = [
        'password',
        'remember_token',
    ];

    /**
     * The attributes that should be cast.
     *
     * @var array
     */
    protected $casts = [
        'email_verified_at' => 'datetime',
    ];

    public function locations()
    {
        return $this->hasMany(Location::class);
    }

    public function reviews()
    {
        return $this->hasMany(Review::class);
    }
}
登录后复制

3. 修改登录表单(login.blade.php)

确保你的登录表单(login.blade.php)使用 username 字段作为登录的输入。检查 resources/views/auth/login.blade.php 文件,并确保表单中包含 username 字段,并且 name 属性设置为 username。

@section('content')
<div class="container">
    <div class="row justify-content-center">
        <div class="col-md-8">
            <div class="card">
                <div class="card-header">{{ __('Login') }}</div>

                <div class="card-body">
                    <form method="POST" action="{{ route('login') }}">
                        @csrf

                        <div class="form-group row">
                            <label for="username" class="col-md-4 col-form-label text-md-right">Username</label>

                            <div class="col-md-6">
                                <input id="username" type="text" class="form-control @error('username') is-invalid @enderror" name="username" value="{{ old('username') }}" required autocomplete="username" autofocus>

                                @error('username')
                                <span class="invalid-feedback" role="alert">
                                        <strong>{{ $message }}</strong>
                                    </span>
                                @enderror
                            </div>
                        </div>

                        <div class="form-group row">
                            <label for="password" class="col-md-4 col-form-label text-md-right">{{ __('Password') }}</label>

                            <div class="col-md-6">
                                <input id="password" type="password" class="form-control @error('password') is-invalid @enderror" name="password" required autocomplete="current-password">

                                @error('password')
                                    <span class="invalid-feedback" role="alert">
                                        <strong>{{ $message }}</strong>
                                    </span>
                                @enderror
                            </div>
                        </div>

                        <div class="form-group row">
                            <div class="col-md-6 offset-md-4">
                                <div class="form-check">
                                    <input class="form-check-input" type="checkbox" name="remember" id="remember" {{ old('remember') ? 'checked' : '' }}>

                                    <label class="form-check-label" for="remember">
                                        {{ __('Remember Me') }}
                                    </label>
                                </div>
                            </div>
                        </div>

                        <div class="form-group row mb-0">
                            <div class="col-md-8 offset-md-4">
                                <button type="submit" class="btn btn-primary">
                                    {{ __('Login') }}
                                </button>

                                @if (Route::has('password.request'))
                                    <a class="btn btn-link" href="{{ route('password.request') }}">
                                        {{ __('Forgot Your Password?') }}
                                    </a>
                                @endif
                            </div>
                        </div>
                    </form>
                </div>
            </div>
        </div>
    </div>
</div>
@endsection
登录后复制

4. 验证 Migration 文件

检查你的 users 表的 migration 文件,确保 username 字段存在并且是唯一的。

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateUsersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->id();
            $table->string('username')->unique();
            $table->string('password');
            $table->tinyInteger('role');

            $table->rememberToken();
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('users');
    }
}
登录后复制

5. 清除缓存

在修改了配置文件或控制器后,建议清除缓存以确保 Laravel 加载最新的配置。

php artisan config:clear
php artisan cache:clear
php artisan view:clear
登录后复制

注意事项

  • 唯一性验证: 确保 username 字段在数据库中是唯一的,否则可能会导致登录失败。
  • 密码加密: 始终使用 Hash::make() 函数对用户密码进行加密,以确保安全性。
  • 错误处理: 在登录表单中添加适当的错误处理,以便向用户显示有用的错误消息。

总结

通过以上步骤,你应该能够成功配置 Laravel 8 使用 username 字段进行身份验证。 关键在于重写 LoginController 中的 username() 方法,并确保你的数据库迁移、模型和登录表单都与新的配置保持一致。 记住清除缓存,并进行充分的测试以确保一切正常运行。

以上就是Laravel 8 注册成功但登录失败:使用用户名进行身份验证的配置指南的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号