自定义 Laravel Jetstream 登录:添加 is_admin 验证

自定义 laravel jetstream 登录:添加 is_admin 验证

本文档旨在指导开发者在使用 Laravel Jetstream Livewire 时,如何自定义登录逻辑,实现基于 is_admin 字段的权限验证。通过修改用户认证流程,确保只有 is_admin 值为 1 的用户才能成功登录系统,从而增强应用的安全性。

修改用户认证流程

在使用 Laravel Jetstream 的项目中,通常会默认使用 Fortify 进行用户认证。自定义登录逻辑,特别是添加额外的字段验证,可以通过两种主要方式实现。这两种方法都允许你在用户认证过程中加入自定义逻辑,例如验证 is_admin 字段。

方法一:修改 User 模型

可以在 App/Models/User.php 文件中添加一个 boot 方法,并使用 Fortify::authenticateUsing 方法来自定义认证逻辑。这种方式的优点是直接在 User 模型中定义认证逻辑,使代码更集中。

<?php

namespace App/Models;

use Illuminate/Foundation/Auth/User as Authenticatable;
use Illuminate/Http/Request;
use Illuminate/Support/Facades/Hash;
use Laravel/Fortify/Fortify;

class User extends Authenticatable
{
    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name',
        'email',
        'password',
        'is_admin', // 确保 is_admin 字段在 fillable 数组中
    ];

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public static function boot()
    {
        parent::boot();

        Fortify::authenticateUsing(function (Request $request) {
            $user = User::where('email', $request->email)->first();

            if ($user &&
                Hash::check($request->password, $user->password) &&
                $user->is_admin == 1) {
                return $user;
            }

            return null; // 或者返回 false,具体取决于你的需求
        });
    }
}
登录后复制

注意事项:

  • 确保 User 模型中存在 is_admin 字段,并且该字段已添加到 $fillable 数组中,以便可以进行批量赋值。
  • parent::boot() 必须调用,以确保模型的基础功能正常运行。

方法二:修改 FortifyServiceProvider

另一种方法是修改 app/Providers/FortifyServiceProvider.php 文件。在 boot 方法中,使用 Fortify::authenticateUsing 方法来定义自定义认证逻辑。

<?php

namespace App/Providers;

use Illuminate/Support/ServiceProvider;
use Laravel/Fortify/Fortify;
use Illuminate/Http/Request;
use App/Models/User;
use Illuminate/Support/Facades/Hash;

class FortifyServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        Fortify::authenticateUsing(function (Request $request) {
            $user = User::where(['email' => $request->email, 'is_admin' => 1])->first();

            if ($user && Hash::check($request->password, $user->password)) {
                return $user;
            }
        });
    }
}
登录后复制

代码解释:

  1. Fortify::authenticateUsing(function (Request $request) { … });:使用 Fortify::authenticateUsing 方法注册一个自定义的认证逻辑。该方法接收一个闭包,闭包接收一个 Request 对象,包含了用户的登录请求信息。
  2. $user = User::where([’email’ => $request->email, ‘is_admin’ => 1])->first();:使用 Eloquent ORM 查询数据库,查找 email 和 is_admin 都匹配的用户。first() 方法返回第一个匹配的用户,如果没有找到则返回 null。
  3. if ($user && Hash::check($request->password, $user->password)) { … }:如果找到了用户,并且用户输入的密码经过哈希验证后与数据库中的密码匹配,则表示认证成功。
  4. return $user;:如果认证成功,返回 User 对象。Fortify 会自动将该用户设置为当前登录用户。

安全提示:

避免在前端传递 is_admin 字段,尤其是使用隐藏字段。因为这容易被篡改。在后端进行 is_admin 的验证是更安全可靠的方式。

总结:

通过修改 User 模型或 FortifyServiceProvider,可以轻松地自定义 Laravel Jetstream 的登录逻辑,添加额外的验证条件,例如 is_admin 字段的验证。选择哪种方法取决于你的项目结构和个人偏好。重要的是确保认证逻辑的安全性,避免在前端传递敏感信息。

以上就是自定义 Laravel Jetstream 登录:添加 is_admin 验证的详细内容,更多请关注php中文网其它相关文章!

https://www.php.cn/faq/1428832.html

发表回复

Your email address will not be published. Required fields are marked *