
本文档旨在解决 Laravel 8 项目中注册功能正常,但登录功能失效的问题。通常,这是由于 Laravel 默认使用 email 进行身份验证,而项目配置为使用用户名或其他字段。本文将提供详细步骤,指导您如何配置 Laravel 使用用户名进行登录,并附带示例代码和注意事项,确保您的身份验证流程正确无误。
在 Laravel 中,默认情况下,身份验证系统使用 email 字段作为用户的唯一标识符进行登录。如果你的应用使用 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 字段进行身份验证。
如果你的 User 模型中存在与 email 相关的验证规则,你需要确保它们不会干扰到使用 username 进行身份验证。检查 app/Models/User.php 文件,确认 fillable 属性中包含 username,并且没有强制要求 email 字段。
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);
}
}确保你的登录表单(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检查你的 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');
}
}在修改了配置文件或控制器后,建议清除缓存以确保 Laravel 加载最新的配置。
php artisan config:clear php artisan cache:clear php artisan view:clear
通过以上步骤,你应该能够成功配置 Laravel 8 使用 username 字段进行身份验证。 关键在于重写 LoginController 中的 username() 方法,并确保你的数据库迁移、模型和登录表单都与新的配置保持一致。 记住清除缓存,并进行充分的测试以确保一切正常运行。
以上就是Laravel 8 注册成功但登录失败:使用用户名进行身份验证的配置指南的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号