You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel应用注册限制实现:单IP单账号+仅允许Gmail注册

没问题,我来帮你搞定这两个注册限制需求——每个IP只能注册一个账号,并且只接受Gmail邮箱。下面是一步步的具体实现方案,都是Laravel原生操作,很容易上手:

实现步骤

1. 给用户表添加IP地址字段

首先我们需要记录每个注册用户的IP地址,这样才能判断该IP是否已经注册过账号。

创建迁移文件

运行Artisan命令生成针对users表的迁移:

php artisan make:migration add_ip_address_to_users_table --table=users

编辑迁移文件

打开database/migrations目录下刚生成的迁移文件,修改up和down方法:

public function up()
{
    Schema::table('users', function (Blueprint $table) {
        $table->string('ip_address')->nullable();
    });
}

public function down()
{
    Schema::table('users', function (Blueprint $table) {
        $table->dropColumn('ip_address');
    });
}

执行迁移

运行命令完成字段添加:

php artisan migrate

2. 修改注册验证逻辑

接下来我们要在注册流程里加入两个关键验证:仅允许Gmail邮箱、当前IP未注册过账号。

打开app/Http/Controllers/Auth/RegisterController.php,更新里面的validator和create方法:

更新验证规则

use Illuminate\Support\Facades\Validator;

protected function validator(array $data)
{
    // 将当前请求的IP地址加入到验证数据中
    $data['ip_address'] = request()->ip();

    return Validator::make($data, [
        'name' => ['required', 'string', 'max:255'],
        // 新增正则验证,确保邮箱是@gmail.com结尾
        'email' => ['required', 'string', 'email', 'max:255', 'unique:users', 'regex:/^[a-zA-Z0-9._%+-]+@gmail\.com$/'],
        'password' => ['required', 'string', 'min:8', 'confirmed'],
        // 验证当前IP未在users表中存在
        'ip_address' => ['unique:users,ip_address'],
    ], [
        // 自定义友好的错误提示
        'email.regex' => '仅接受Gmail邮箱注册,请使用正确的邮箱地址。',
        'ip_address.unique' => '该IP地址已经注册过账号,无法重复注册。',
    ]);
}

保存用户IP到数据库

修改create方法,在创建用户时把当前IP存入数据库:

use Illuminate\Support\Facades\Hash;

protected function create(array $data)
{
    return User::create([
        'name' => $data['name'],
        'email' => $data['email'],
        'password' => Hash::make($data['password']),
        // 存储当前请求的IP地址
        'ip_address' => $data['ip_address'],
    ]);
}

3. 测试验证效果

现在你可以测试注册功能了:

  • 使用非Gmail邮箱注册时,会弹出对应错误提示
  • 同一个IP尝试注册第二个账号时,会被系统拒绝
  • 符合条件的Gmail邮箱+未注册过的IP,可以正常完成注册

补充说明

  • 如果你的项目使用了自定义表单请求类(比如RegisterRequest),可以把上述验证规则移到该类的rules方法中,逻辑完全一致。
  • 对于动态IP或代理IP的场景,这个基础方案可能存在局限性,但对于大多数普通场景已经足够。如果需要更严格的限制,可以结合Cookie或会话验证来辅助判断。

内容的提问来源于stack exchange,提问作者Mustafa Al Eisa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:18:32