Laravel实现用户注册和登录

yizhihongxing

我会详细讲解一下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日

相关文章

  • 使用CSS画爱心的过程详解

    下面就是“使用CSS画爱心的过程详解”的完整攻略及示例: 1. 确定画布和心形的大小 首先,在CSS中,我们先设定要绘制的爱心的大小,比如: .heart{ width: 50px; height: 50px; } 这里我们的爱心宽和高都是50px。另外,在画爱心前,我们需要先设置其容器的大小,以便我们能够更好地控制制爱心的位置和大小。代码如下: .cont…

    css 2023年6月10日
    00
  • 利用css制作3D照片墙效果

    下面是制作3D照片墙效果的完整攻略: 1. 概述 制作3D照片墙效果需要使用CSS3的transform属性来控制元素的位置和旋转角度,同时还需要使用伪元素和z-index属性来实现层叠效果。总体实现过程包括以下几个步骤: 创建一个包含图片的HTML结构,每个图片需要设置一个固定大小的容器和一个img标签。 对图片容器设置透视距离,以及一些基础的样式,比如宽…

    css 2023年6月10日
    00
  • AngularJS学习笔记之表单验证功能实例详解

    这篇文章将详细讲解如何使用AngularJS实现表单验证功能。下面将分步说明该过程: 1. 引入AngularJS 首先,我们需要在我们的HTML文件中引入AngularJS的库文件。可以使用CDN或下载到本地并放在项目中。 通过CDN引入AngularJS库文件: <script src="https://cdn.bootcdn.net/a…

    css 2023年6月10日
    00
  • React 悬浮框内容懒加载实例详解

    下面是“React 悬浮框内容懒加载实例详解”的完整攻略。 什么是悬浮框内容懒加载? 悬浮框是一种常见的UI元素,它通常用于在用户与页面的交互过程中显示更多信息。但如果悬浮框中的内容过多,可能会导致页面加载时间过长。在这种情况下,使用懒加载是一种非常有效的方式。 悬浮框内容懒加载指的是在用户与页面进行交互时才加载悬浮框中的内容,从而减少页面的加载时间和带宽消…

    css 2023年6月10日
    00
  • js上传图片预览的实现方法

    下面是关于“js上传图片预览的实现方法”的完整攻略。 一、实现思路 实现图片上传预览功能,我们需要以下几步: HTML页面中新增一个input元素用于文件上传; 给这个input元素绑定change事件,当用户选择一个本地图片进行上传时,就会触发change事件; 获取用户上传的图片文件,并通过FileReader API将它读成DataURL格式的图像; …

    css 2023年6月11日
    00
  • ASP.NET Datagridview自动换行的小例子

    ASP.NET Datagridview自动换行是一个比较常见并且非常有用的功能,它能够在数据较多时,将数据自动进行换行,从而使得表格更易读。下面是一个完整的攻略,包含了基本步骤和两个实例说明: 基本步骤 以下是实现ASP.NET Datagridview自动换行的基本步骤: Step 1 转换字段类型 为了让Datagridview进行自动换行,首先需要将…

    css 2023年6月10日
    00
  • 哔哩哔哩视频出现绿屏/红屏/黑屏怎么办?b站视频绿屏现象的解决办法介绍

    下面我为大家详细讲解一下“哔哩哔哩视频出现绿屏/红屏/黑屏怎么办?”的完整攻略。 1. 问题描述 当我们在B站上观看视频时,有时候会出现绿屏、红屏、黑屏等现象,影响我们的观看体验,该怎么办呢? 2. 解决办法 2.1 清除缓存和Cookie 第一种解决办法是清除浏览器缓存和Cookie。这是因为有时候浏览器缓存文件、Cookie等可能会导致视频出现绿屏、红屏…

    css 2023年6月9日
    00
  • 常用的新闻列表代码(ul/li布局方式)

    常用的新闻列表代码采用的是ul/li布局方式,是一个非常通用的排版方式。以下是使用该方式的标准代码示例: <ul> <li>新闻一</li> <li>新闻二</li> <li>新闻三</li> </ul> 在上面的代码中,<ul>表示无序列表,<…

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