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

如何在GitLab中为特定域名设置专属User cap(用户注册上限)

按域名维度设置GitLab注册用户上限实现方案

1. 数据库层扩展

首先新增存储不同域名注册配额的表,通过Rails迁移实现:

  • 新建迁移文件 db/migrate/[时间戳]_create_email_domain_user_caps.rb,代码如下:
class CreateEmailDomainUserCaps < ActiveRecord::Migration[6.1]
  def change
    create_table :email_domain_user_caps do |t|
      t.string :domain, null: false, index: { unique: true }
      t.integer :cap, null: false, default: 0
      t.timestamps
    end
  end
end
  • 执行迁移命令完成表创建:rake db:migrate

2. 新增域名配额模型

创建 app/models/email_domain_user_cap.rb 对应新表,添加基础校验:

class EmailDomainUserCap < ApplicationRecord
  # 校验域名格式、配额为正整数
  validates :domain, presence: true, format: { with: /\A[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}\z/ }
  validates :cap, presence: true, numericality: { only_integer: true, greater_than: 0 }
end

3. 改造User模型校验逻辑

替换原有硬编码的统一配额逻辑,改为读取域名配额表的配置:

# gitlab/app/models/user.rb
class User < ApplicationRecord
  # ...
  validate :ensure_user_email_count

  # 优化域名提取逻辑,避免正则匹配异常
  def email_domain
    @email_domain ||= email.to_s.split('@').last.downcase
  end

  def ensure_user_email_count
    # 读取对应域名的配额配置,无配置则不做限制
    domain_cap = EmailDomainUserCap.find_by(domain: email_domain)
    return unless domain_cap

    # 统计当前域名已注册用户数
    current_count = User.where("LOWER(email) LIKE ?", "%@#{email_domain}").count
    if current_count >= domain_cap.cap
      errors.add(:email, _("域名 %{domain} 已达到最大注册名额 %{cap} 个") % { domain: email_domain, cap: domain_cap.cap })
    end
  end
end

4. 扩展Admin Settings后台配置页面

  • 新增路由:在 config/routes.rb 的admin命名空间下添加配置路由:
namespace :admin do
  # 保留原有其他路由,新增以下内容
  resources :email_domain_user_caps, except: [:show]
end
  • 新增控制器 app/controllers/admin/email_domain_user_caps_controller.rb,实现域名配额的CRUD逻辑,仅开放给管理员权限访问:
class Admin::EmailDomainUserCapsController < Admin::ApplicationController
  def index
    @domain_caps = EmailDomainUserCap.all.order(:domain)
  end

  def create
    @domain_cap = EmailDomainUserCap.new(domain_cap_params)
    if @domain_cap.save
      redirect_to admin_email_domain_user_caps_path, notice: _('域名配额添加成功')
    else
      render :index
    end
  end

  # update、destroy方法按常规Rails CRUD逻辑实现即可,此处省略

  private
  def domain_cap_params
    params.require(:email_domain_user_cap).permit(:domain, :cap)
  end
end
  • 新增对应视图页面,在Admin设置的「账户与限制」分类下添加入口,页面包含已有配额列表、新增/编辑/删除功能。

5. 边界场景适配

  • 存量已超过配额的域名用户不受影响,仅限制后续新注册请求
  • 可新增全局开关控制是否启用按域名限制功能,方便故障回滚
  • 批量导入用户、管理员手动创建用户的场景,可根据需求选择是否继承该校验逻辑

内容的提问来源于stack exchange,提问作者Ann Lin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 14:24:04