Laravel实现用户注册和登录

我会详细讲解一下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方法将用户信息存储到数据库中。最后,将用户信息写入到当前会话中,实现用户的登录状态。但是,我们还没有实现createvalidator方法,现在我们一起实现这两个方法。

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技术站

(0)
上一篇 2023年6月10日
下一篇 2023年6月10日

相关文章

  • jquery validate表单验证插件

    下面是关于jquery validate表单验证插件的完整攻略,内容分为以下几部分: 什么是jquery validate表单验证插件 jquery validate是一个基于jQuery的表单验证插件,它可以实现非常全面的表单验证功能,包括表单必填、表单格式验证、自定义验证规则等,能帮助我们轻松实现表单验证,提高用户体验。 如何引入jquery valid…

    css 2023年6月9日
    00
  • 第一次记录Bootstrap table学习笔记(1)

    针对网站的文章“第一次记录Bootstrap table学习笔记(1)”,我整理了以下完整攻略: 第一步:阅读文章 首先应该认真阅读文章,理解作者写作的目的。在阅读的过程中,我们可以借助markdown的编写方式,使用标题、加粗、斜体等方式标注出重点、关键字等。同时我们需要重点关注文章中的示例代码。 第二步:理解Bootstrap table 在阅读文章后,…

    css 2023年6月10日
    00
  • css入门教程之学习网页布局(1)

    以下是关于“CSS入门教程之学习网页布局(1)”的完整攻略。 步骤一:HTML 结构 首先,需要在 HTML 文件中定义网页的结构。以下是一个示例: <!DOCTYPE html> <html> <head> <title>网页标题</title> </head> <body&gt…

    css 2023年5月18日
    00
  • 颜色之ARGB与RGB、RGBA的区别与介绍

    颜色之ARGB与RGB、RGBA的区别与介绍 什么是ARGB、RGB和RGBA ARGB:A代表Alpha透明度,R、G、B分别代表Red(红)、Green(绿)、Blue(蓝),ARGB通常用于表示有透明度的颜色。 RGB:R、G、B同样代表Red(红)、Green(绿)、Blue(蓝),RGB通常用于表示无透明度的颜色。 RGBA:与RGB相似,只不过多…

    css 2023年6月9日
    00
  • CSS教程:css属性之媒体(Media)类型

    让我们开始讲解“CSS教程: CSS属性之媒体类型”。 什么是媒体类型? 媒体类型是指应用 CSS 样式规则的设备或媒介类型。我们可以使用媒体查询(Media Query)指定不同设备或媒介类型的样式规则,以实现响应式设计。 媒体类型的类型 以下是常见的媒体类型: all:所有设备,包括打印机和屏幕。 print:打印机。 screen:电脑屏幕、平板和智能…

    css 2023年6月10日
    00
  • jquery实现的鼠标拖动排序Li或Table

    这里是一份完整的攻略来讲解如何使用jQuery实现鼠标拖动排序li或table,并提供了两个示例说明。 第1步:引入jQuery库文件 在文档的head标签中引入jQuery库文件。 <head> <script src="https://code.jquery.com/jquery-3.5.1.min.js">&…

    css 2023年6月10日
    00
  • 基于Vue3编写一个简单的播放器

    这里是基于Vue3编写一个简单的播放器的详细攻略: 1. 确定界面和组件结构 在开始编写代码之前,我们需要明确播放器的界面和组件结构。这里我们可以画出播放器的框架图,以确定所需要的组件和它们之间的关系。 2. 安装和配置Vue3 在开始编写代码之前,我们需要安装和配置Vue3。首先我们需要安装Vue3的依赖包: npm install vue@next vu…

    css 2023年6月10日
    00
  • jQuery操作元素css样式的三种方法

    当需要使用JS做一些动态的效果时,我们通常会操作元素的css属性。而 jQuery 作为一款非常优秀的 JS 框架,其提供了多种便利的操作 DOM 元素的方法,操作元素的 css 样式也是其中之一。 下面,我将为大家详细介绍 jQuery 操作元素 css 样式的三种方法: 1. 使用 .css() 方法 调用 .css() 方法改变元素的 CSS 属性。它…

    css 2023年6月10日
    00
合作推广
合作推广
分享本页
返回顶部