Laravel 9 如何在RegisterController添加邮箱域名白名单校验
注册邮箱白名单校验实现方案
你之前写死单域名的正则只能匹配固定后缀,要适配配置文件里的全量白名单域名,直接按下面两种方案实现即可,优先选第一种闭包校验的方式,可维护性更高,没有正则转义的坑。
前置配置确认
首先确保你的白名单配置文件返回格式为域名数组,示例:
// config/email_whitelist.php return [ 'allowed_domains' => [ 'gmail.com', 'hotmail.com', // 后续新增允许的域名直接追加到该数组即可 ] ];
方案1:自定义闭包校验(推荐)
逻辑是先通过框架自带的email规则校验邮箱格式合法性,再拆分提取邮箱的域名部分,统一转小写后和白名单数组做比对,完全不需要写复杂正则:
// 控制器/表单验证类中的校验规则示例 $validated = $request->validate([ 'email' => [ 'required', 'email:rfc,dns', // 先做基础邮箱格式、DNS有效性校验 function ($attribute, $value, $fail) { // 拆分提取@后的域名部分,统一转小写避免大小写匹配误差 $emailDomain = strtolower(explode('@', $value)[1] ?? ''); $allowedDomains = array_map('strtolower', config('email_whitelist.allowed_domains', [])); if (!in_array($emailDomain, $allowedDomains)) { $fail('当前邮箱域名不在允许注册范围内,请使用指定域名的邮箱完成注册'); } }, ], // 其余字段的校验规则按业务需求正常添加即可 ]);
方案2:动态生成正则匹配规则
如果需要沿用regex校验规则的写法,不要硬编码域名,先读取配置动态拼接正则,注意必须对每个域名做正则特殊字符转义,避免后续加的域名包含正则符号导致匹配异常:
$allowedDomains = config('email_whitelist.allowed_domains', []); // 转义所有域名的正则特殊字符 $escapedDomains = array_map(fn($domain) => preg_quote($domain, '/'), $allowedDomains); // 拼接生成最终正则:匹配任意前缀+@+白名单域名结尾,不区分大小写 $regex = '/^.*@(' . implode('|', $escapedDomains) . ')$/i'; // 校验规则中直接使用生成的正则即可 $rules = [ 'email' => ['required', 'email:rfc,dns', "regex:$regex"] ];
注意事项
- 所有域名比对前统一转小写,避免
Gmail.com、HOTMAIL.COM这类大小写差异导致的误拦截 - 必须先加框架自带的email格式校验,避免非法格式邮箱触发拆分域名的逻辑报错
- 不要直接拼接未转义的域名生成正则,防止特殊字符导致正则匹配失效
内容的提问来源于stack exchange,提问作者CryptoPath
相关产品推荐
相关产品推荐

