我会详细讲解一下Laravel实现用户注册和登录的完整攻略。
环境准备
首先,我们需要准备好Laravel开发环境,包括PHP、Composer等。具体的安装过程可以参考Laravel的官方文档。
创建用户模型和数据库表
在Laravel中,可以使用Artisan命令来快速生成用户模型和数据库迁移文件:
php artisan make:model User -m
执行这条命令后,Laravel会同时生成一个名为User
的模型文件和一个名为create_users_table
的迁移文件。我们可以在create_users_table
文件中定义用户表的各个字段:
Schema::create('users', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('email')->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password');
$table->rememberToken();
$table->timestamps();
});
然后执行迁移命令:
php artisan migrate
该命令会在数据库中创建一个名为users
的表,用于存储用户信息。
创建用户注册页面
为了让用户能够注册,我们需要创建一个注册页面。可以在resources/views/auth/register.blade.php
创建该页面:
@extends('layouts.app')
@section('content')
<div class="card">
<div class="card-header">{{ __('Register') }}</div>
<div class="card-body">
<form method="POST" action="{{ route('register') }}">
@csrf
<div class="form-group row">
<label for="name" class="col-md-4 col-form-label text-md-right">{{ __('Name') }}</label>
<div class="col-md-6">
<input id="name" type="text" class="form-control @error('name') is-invalid @enderror" name="name" value="{{ old('name') }}" required autocomplete="name" autofocus>
@error('name')
<span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong>
</span>
@enderror
</div>
</div>
<div class="form-group row">
<label for="email" class="col-md-4 col-form-label text-md-right">{{ __('E-Mail Address') }}</label>
<div class="col-md-6">
<input id="email" type="email" class="form-control @error('email') is-invalid @enderror" name="email" value="{{ old('email') }}" required autocomplete="email">
@error('email')
<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="new-password">
@error('password')
<span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong>
</span>
@enderror
</div>
</div>
<div class="form-group row">
<label for="password-confirm" class="col-md-4 col-form-label text-md-right">{{ __('Confirm Password') }}</label>
<div class="col-md-6">
<input id="password-confirm" type="password" class="form-control" name="password_confirmation" required autocomplete="new-password">
</div>
</div>
<div class="form-group row mb-0">
<div class="col-md-6 offset-md-4">
<button type="submit" class="btn btn-primary">
{{ __('Register') }}
</button>
</div>
</div>
</form>
</div>
</div>
@endsection
在routes/web.php
文件中添加如下代码:
Route::get('/register', function () {
return view('auth.register');
});
这样,当用户访问/register
地址时,会显示出注册页面。
处理用户注册请求
当用户在注册页面填写好用户名、邮箱和密码后,需要将这些信息提交到后端进行处理。现在我们来处理这些请求。
在app/Http/Controllers/Auth/RegisterController.php
控制器中,我们需要添加一个register
方法,该方法用于处理注册请求:
public function register(Request $request)
{
$this->validator($request->all())->validate();
event(new Registered($user = $this->create($request->all())));
Auth::login($user);
return redirect($this->redirectPath());
}
这个方法首先会校验注册信息的合法性,然后使用create
方法将用户信息存储到数据库中。最后,将用户信息写入到当前会话中,实现用户的登录状态。但是,我们还没有实现create
和validator
方法,现在我们一起实现这两个方法。
validator
方法用于校验用户提交的信息是否合法。我们需要在app/Http/Controllers/Auth/RegisterController.php
控制器中添加该方法:
protected function validator(array $data)
{
return Validator::make($data, [
'name' => ['required', 'string', 'max:255'],
'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
'password' => ['required', 'string', 'min:8', 'confirmed'],
]);
}
这里我们使用了Laravel提供的Validator
类,支持多种验证规则。
create
方法用于将注册信息写入到数据库中。我们需要在app/Http/Controllers/Auth/RegisterController.php
控制器中添加该方法:
protected function create(array $data)
{
return User::create([
'name' => $data['name'],
'email' => $data['email'],
'password' => Hash::make($data['password']),
]);
}
这个方法将用户的密码进行加密后存储到数据库中,增加了账户的安全性。
创建用户登录页面
在Laravel中,用户登录页面同样可以使用Laravel自带的auth
视图模板,可以在resources/views/auth/login.blade.php
创建该页面。
@extends('layouts.app')
@section('content')
<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="email" class="col-md-4 col-form-label text-md-right">{{ __('E-Mail Address') }}</label>
<div class="col-md-6">
<input id="email" type="email" class="form-control @error('email') is-invalid @enderror" name="email" value="{{ old('email') }}" required autocomplete="email" autofocus>
@error('email')
<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>
@endsection
在routes/web.php
文件中添加如下代码:
Route::get('/login', function () {
return view('auth.login');
});
这样,当用户访问/login
地址时,会显示出登录页面。
处理用户登录请求
当用户在登录页面输入用户名和密码后,需要将这些信息提交到后端进行处理。现在我们来处理这些请求。
在app/Http/Controllers/Auth/LoginController.php
控制器中,我们需要添加一个login
方法,该方法用于处理登录请求:
public function login(Request $request)
{
$request->validate([
'email' => 'required|email',
'password' => 'required',
]);
$credentials = $request->only('email', 'password');
if (Auth::attempt($credentials)) {
$request->session()->regenerate();
return redirect()->intended('/');
}
return back()->withErrors([
'email' => 'The provided credentials do not match our records.',
]);
}
这个方法首先会校验登录信息的合法性,然后使用attempt
方法将用户信息进行认证。如果认证成功,将用户信息写入到会话中,实现用户的登录状态。如果认证失败,将会提示用户错误信息。但是,我们还没有实现attempt
方法,现在我们来一起实现这个方法。
attempt
方法用于对用户进行身份验证。我们需要在app/Providers/AuthServiceProvider.php
文件中添加boot
方法内容:
public function boot()
{
$this->registerPolicies();
Auth::viaRequest('api', function ($request) {
return User::where('api_token', $request->input('api_token'))->first();
});
}
这个方法将为Laravel提供一个新的用户身份验证驱动。在这里我们使用viaRequest
方法自定义身份验证驱动,用于验证用户的登录信息是否正确。如果验证成功,将返回对应的用户信息,否则返回null
。
以上就是Laravel实现用户注册和登录的完整攻略。在以上的过程中,我们使用了Laravel自带的artian
命令创建模型和迁移,创建了用户注册页面和用户登录页面,并通过相应的控制器处理用户的注册和登录信息请求。同时,还讲述了如何自定义身份验证驱动attempt
方法,实现对用户身份的认证。
例如示例1:
用户“张三”在注册页面注册账号“zhangsan@126.com”,密码“123456”,提交注册请求后返回到登录页。用户打开登录页输入注册的账号和密码,提交请求,控制器处理后,发现账号和密码是正确的,控制器将用户信息写入到会话中,实现用户的登录状态。此时用户返回到首页,即可看到登陆成功的状态。
例如示例2:
用户“李四”在登录页面输入了一个错误的用户名“lisid@126.com”和密码“654321”,提交登录请求后,控制器无法验证该用户的登录信息,于是提示“用户名或密码错误”信息。此时用户重新输入正确的账号和密码,并提交请求,控制器处理成功后用户成功登录,可以进入到所需的页面。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Laravel实现用户注册和登录 - Python技术站