如何在JavaScript中验证电子邮件地址?
我父亲说资本(多年前)过去很重要的电子邮件地址,但现在不再了.我很确定他们从未这样做过,因为那些涉及DNS/MX变化的东西不会改变.特别是在线没有容易找到的记录.
我创建了一个自定义 UserModel 并使用电子邮件作为主要的身份验证 ID 而不是用户名。
它区分大小写的问题,因为它将 test@gmail.com,Test@gmail.com 计为 2 个不同的帐户。
我需要强制它处理 1 个帐户,而忽略它是大写还是小写。
这是我的文件:
模型.py
class UserModelManager(BaseUserManager):
def create_user(self, email, password, pseudo):
user = self.model()
user.name = name
user.email = self.normalize_email(email=email)
user.set_password(password)
user.save()
return user
def create_superuser(self, email, password):
'''
Used for: python manage.py createsuperuser
'''
user = self.model()
user.name = 'admin-yeah'
user.email = self.normalize_email(email=email)
user.set_password(password)
user.is_staff = True
user.is_superuser = True
user.save()
return user
class UserModel(AbstractBaseUser, PermissionsMixin):
## Personnal fields.
email = models.EmailField(max_length=254, unique=True)
name = models.CharField(max_length=16)
## [...] …
Run Code Online (Sandbox Code Playgroud) 所以,如果我有代码
.rsform-input-box {text-transform: uppercase;}
Run Code Online (Sandbox Code Playgroud)
在特定于我们底部的表单字段的网站http://www.thediabetesnetwork.com上,您会看到在键入时转换为大写,但在您键入的情况下导出数据.例如,如果我键入Shane,它在视觉上显示了SHANE.在提交时,它将恢复到数据库中的Shane(之前的某个时刻).
我的问题是为什么它会这样做以及围绕选项的工作是什么?我的另一个选择是
function toUpCase()
{
document.getElementById("first").value=document.getElementById("first").value.toUpperCase();
document.getElementById("last").value=document.getElementById("last").value.toUpperCase();
document.getElementById("email").value=document.getElementById("email").value.toUpperCase();
}
Run Code Online (Sandbox Code Playgroud) 我不时会注意到用户的电子邮件是重复的.即使使用模型验证(应用程序级别)来检查唯一性.我怀疑这与并发问题有关.
我决定在数据库级别添加一个索引来解决这个问题.
无论如何,较低的指数可能是明智的.
即使我们保证在应用程序级别降低电子邮件.数据库提供了更强的一致性保证.
它可能永远不会重要,但让数据库强制执行它也不会受到伤害.
我可以提供许多额外的保护措施,以最大限度地提高从应用程序端输入大写字符的几率,但应用程序仍然无法控制从其他来源进入数据库的数据,并且所有代码都倾向于开发人员错误,维护成本等
class CreateUniqueIndexForUserEmails < ActiveRecord::Migration
def up
remove_index :users, :email
execute <<-SQL
CREATE UNIQUE INDEX index_users_on_lower_email ON users (LOWER(email));
SQL
end
def down
execute <<-SQL
DROP INDEX index_users_on_lower_email;
SQL
add_index :users, :email
end
end
Run Code Online (Sandbox Code Playgroud)
我还将此逻辑与user
模型中的此代码块相结合:
def email=(value)
write_attribute :email, value.downcase
end
Run Code Online (Sandbox Code Playgroud)
这确保FooBar@email.com
重写为foobar@email.com
(在应用程序级别).
我在线阅读了一篇RFC,主要来自Are电子邮件地址区分大小写的指针?表明一些电子邮件服务器关心区分大小写.
即便如此,当我今天发送电子邮件时.我几乎不把心思放进肠衣里.事实上,我输入的电子邮件是羽绒服.电子邮件仍然可以发送
RFC是否值得高度考虑?即如果用户输入FooBar@email.com
,app将电子邮件注册为foobar@email.com
.这会对电子邮件"可传递性"产生任何影响吗?
如果没有,我应该考虑哪些其他问题?
在构建我的应用程序时,我通过运行使用了Laravel身份验证脚手架,php artisan make:auth
这非常棒并且节省了我很多时间.
但是,我遇到的问题是用户无法登录,因为他们无法记住他们最初注册时用于电子邮件的情况.
例如,注册的用户Myemail@domain.com
无法登录myemail@domain.com
.
我从我的研究中了解到,在技术上,@之前的部分因规范而区分大小写,并且上面的两封电子邮件在理论上可能属于两个不同的人.在我的情况下,我不认为我有可能需要在登录时强制执行此操作.
我使用的是Postgres数据库,所以我希望只需更换电子邮件数据库中查找Auth::attempt()
与ilike
替代的like
,如果可能的.但是,我不能为我的生活找到它在源头的位置,因此不知道我将如何覆盖它.
Tl; dr如何覆盖Laravel的默认身份验证以不区分大小写的方式进行电子邮件查找?
我最终通过首先采用@btl建议并在email属性上实现mutator方法来解决问题.我不想要为现有用户更改所有电子邮件,感觉好像我遇到了一个问题,我想恢复区分大小写,我想要一个可以解决的问题很容易被撤消.
应用程序/ user.php的
public function getEmailAttribute($value) {
return strtolower($value);
}
Run Code Online (Sandbox Code Playgroud)
应用程序/ HTTP /控制器/认证/ LoginController.php
protected function credentials()
{
$username = $this->username();
$credentials = request()->only($username, 'password');
if (isset($credentials[$username])) {
$credentials[$username] = strtolower($credentials[$username]);
}
return $credentials;
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,我无法弄清楚如何应用这个相同的逻辑,ForgotPasswordController.php
但现在我会活着.无论现在如何,登录似乎都有效.
我想检查 Dart 列表是否包含字符串,list.contains
因此必须先将数组中的字符串转换为小写。
如何将列表中的所有字符串转换为小写?
例如:
[example@example.com, Example@example.com, example@Example.com, example@example.cOm, EXAMPLE@example.cOm]
Run Code Online (Sandbox Code Playgroud) email ×2
validation ×2
arrays ×1
css ×1
dart ×1
django ×1
flutter ×1
forms ×1
html ×1
javascript ×1
laravel ×1
laravel-5 ×1
laravel-5.5 ×1
python ×1
regex ×1