主页/PHP笔记/PHP问答/框架Laravel/如何在 Laravel 中验证邮箱和密码

如何在 Laravel 中验证邮箱和密码

Bug编译狮

Bug编译狮

在 Laravel 中验证邮箱和密码通常涉及使用 Eloquent ORM 和 Passport(用于身份验证)。以下是一个基本的流程和示例代码:

1. 安装 Passport

首先,你需要安装 Passport。如果你还没有安装,可以通过 Composer 进行安装:

composer require laravel/passport

2. 配置 Passport

运行以下命令来生成密钥和配置文件:

php artisan passport:install

3. 创建用户模型和迁移

创建一个新的用户模型,并为其创建迁移文件:

php artisan make:model User --migration

User 模型中添加邮箱字段:

namespace App;

use IlluminateContractsAuthMustVerifyEmail;
use IlluminateFoundationAuthUser as Authenticatable;
use IlluminateNotificationsNotifiable;

class User extends Authenticatable implements MustVerifyEmail
{
    use Notifiable;

    protected $fillable = [
        'name', 'email', 'password',
    ];

    protected $hidden = [
        'password', 'remember_token',
    ];

    public function sendEmailVerificationNotification()
    {
        $this->notify(new VerifiesEmail);
    }
}

4. 创建认证路由

Laravel 的默认认证路由已经包含了邮箱和密码的验证逻辑。你可以通过访问 /login 来开始登录过程。

5. 验证邮箱和密码

在控制器中验证邮箱和密码:

namespace AppHttpControllersAuth;

use AppUser;
use IlluminateHttpRequest;
use IlluminateSupportFacadesAuth;
use IlluminateSupportFacadesValidator;

class AuthController extends Controller
{
    public function login(Request $request)
    {
        $validator = Validator::make($request->all(), [
            'email' => 'required|email|max:255|unique:users,email',
            'password' => 'required|min:6',
        ]);

        if ($validator->fails()) {
            return response()->json(['error' => $validator->errors()], 400);
        }

        try {
            if (!Auth::attempt(['email' => $request['email'], 'password' => $request['password']])) {
                return response()->json(['error' => 'Invalid credentials'], 401);
            }

            $user = Auth::user();
            $token = $user->createToken('api-token')->accessToken;

            return response()->json(['access_token' => $token, 'user' => $user], 200);
        } catch (Exception $e) {
            return response()->json(['error' => 'Something went wrong'], 500);
        }
    }
}

示例代码

以下是一个完整的示例代码,展示了如何在控制器中验证邮箱和密码:

<?php

namespace AppHttpControllersAuth;

use AppUser;
use IlluminateHttpRequest;
use IlluminateSupportFacadesAuth;
use IlluminateSupportFacadesValidator;

class AuthController extends Controller
{
    public function login(Request $request)
    {
        $validator = Validator::make($request->all(), [
            'email' => 'required|email|max:255|unique:users,email',
            'password' => 'required|min:6',
        ]);

        if ($validator->fails()) {
            return response()->json(['error' => $validator->errors()], 400);
        }

        try {
            if (!Auth::attempt(['email' => $request['email'], 'password' => $request['password']])) {
                return response()->json(['error' => 'Invalid credentials'], 401);
            }

            $user = Auth::user();
            $token = $user->createToken('api-token')->accessToken;

            return response()->json(['access_token' => $token, 'user' => $user], 200);
        } catch (Exception $e) {
            return response()->json(['error' => 'Something went wrong'], 500);
        }
    }
}

这个示例代码展示了如何在 Laravel 中验证邮箱和密码,并返回一个带有 JWT 访问令牌的响应。

黑板Bug讲师

黑板Bug讲师

介绍

在构建Web应用程序时,安全性是首要关注点之一,尤其是在处理用户凭据(如电子邮件地址和密码)方面。Laravel,一个强大的PHP框架,通过内置功能简化了验证过程。在这篇教程中,我们将全面介绍使用Laravel进行电子邮件和密码验证的方法。

以验证开始。

验证在确保应用程序安全性和维护数据完整性方面起着至关重要的作用。Laravel 提供了多种方式来验证数据;我们将从控制器验证开始。

// In any controller method
$request->validate([
    'email' => 'required|email|unique:users,email',
    'password' => 'required|string|min:6',
]);

这段简单的代码可以确保电子邮件在“用户”表中既唯一又格式正确,并且密码符合最小长度要求。

表单验证:检查数据输入是否符合预期或要求。

对于更复杂的场景,您可能需要将验证逻辑从控制器中分离出来。Laravel的Form Request是一个非常适合这种需求的工具。

php artisan make:request UserRegistrationRequest

请提供需要修改的类代码,以便我进行编辑和添加验证规则的工作。

public function rules()
{
    return [
        'email' => 'required|email|unique:users,email',
        'password' => 'required|min:6|confirmed',
    ];
}

然后,在控制器方法中类型注解请求类:

public function store(UserRegistrationRequest $request)
{
    // The incoming request is valid...

    // Retrieve the validated input...
    $validated = $request->validated();

    // Continue registration...
}

自定义验证规则

如果预定义的校验规则不符合您的需求,您可以创建自定义规则。

php artisan make:rule ValidPassword

然后,在创建的类中定义你的逻辑:

public function passes($attribute, $value)
{
    return preg_match('/[A-Z]/', $value) && 
           preg_match('/[a-z]/', $value) && 
           preg_match('/[0-9]/', $value) && 
           strlen($value) >= 8;
}

public function message()
{
    return 'The :attribute must be at least 8 characters and include at least one uppercase letter, one lowercase letter, and one number.';
}

现在,请使用自定义规则如下:

'password' => ['required', new ValidPassword],

API资源和验证

如果在构建API,Laravel提供了非常有趣的特性叫做API资源,也可以集成验证:

public function toArray($request)
{
    return [
        'email' => 'required|email|unique:users,email',
        'password' => 'required|string|min:6',
    ];
}

这有助于统一和格式化API响应数据。

处理验证错误。

错误变量会与所有视图共享,由IlluminateViewMiddlewareShareErrorsFromSession中间件提供,该中间件属于web中间件组。

在 Blade 模板中,你可以这样显示错误消息:

@if ($errors->any())
  {{ $error }}
@endif

高级验证场景

对于更高级的场景,您可以使用多种其他功能,如条件验证、钩子验证以及通过组合不同类型的验证规则来创建复杂的验证情景。

'email' => [
    'required',
    Rule::unique('users')->where(function ($query) {
        return $query->where('account_id', 1);
    }),
],

'password' => [
    'required',
    function($attribute, $value, $fail) {
        if ($value !== 'my-secret-password') {
            $fail($attribute.' is invalid.');
        }
    },
]

结论

在本教程中,我们介绍了如何在Laravel中验证电子邮件和密码。从控制器方法的基本验证到创建自定义验证规则以及高级技术,Laravel的验证功能既强大又灵活,确保用户输入可以有效地被验证,从而保持您的应用程序安全且用户友好。

长工码奴1523

长工码奴1523

在 Laravel 中,你可以使用 Eloquent ORM 的 Model 对象来验证电子邮件和密码。以下是如何实现的步骤:

  1. 首先,确保你在项目目录中安装了 Laravel,并且已经配置好了数据库。
  2. 创建一个新的模型文件,例如 User.php
    
    <?php

namespace App;

use IlluminateDatabaseEloquentModel; use IlluminateFoundationAuthUser as Authenticatable;

class User extends Authenticatable { protected $table = ‘users’;

// ...其他属性...

public function setPasswordAttribute($value)
{
    $this->attributes['password'] = bcrypt($value);
}

}


3. 然后,创建一个新的控制器,例如 `AuthController.php`:
```php
<?php

namespace AppHttpControllers;

use AppUser;
use IlluminateSupportFacadesHash;
use IlluminateSupportFacadesValidator;

class AuthController extends Controller
{
    /**
     * 登录用户。
     *
     * @param  array  $credentials
     * @return IlluminateHttpJsonResponse
     */
    public function login(array $credentials)
    {
        $validator = Validator::make($credentials, [
            'email' => ['required', 'string', 'email'],
            'password' => ['required', 'string'],
        ]);

        if ($validator->fails()) {
            return response()->json(['error' => $validator->errors()], 400);
        }

        $user = User::where('email', $credentials['email'])->first();

        if (!$user || !Hash::check($credentials['password'], $user->password)) {
            return response()->json(['error' => 'Invalid credentials'], 401);
        }

        return response()->json([
            'token' => $user->createToken('auth_token')->plainTextToken,
            'user' => $user,
        ], 200);
    }
}
  1. config/auth.php 文件中注册这个控制器:

    'providers' => [
    /*
    ...
    'AppHttpControllersAuthController',
    ...
    ]
  2. 最后,在你的控制器或视图中调用这个控制器的方法来验证登录请求:

    
    public function login()
    {
    return auth()->attempt(request(['email', 'password']));
    }

// 或者 if (auth()->attempt(request([’email’, ‘password’])) === true) { return redirect(‘/dashboard’); }



以上就是如何在 Laravel 中验证邮箱和密码的基本步骤。请注意,这只是一个基本的例子,实际的代码可能会根据你的需求有所不同。