哪里有rails6店

  缺陷管理对问题的持续跟蹤!redmine很棒的基于ruby开发

}

我们以创建新用户的页面结束(苐

测试和验证都不是详尽无遗的

只要足以接受大多数有效的电子邮件地址

并拒绝大多数无效的电子邮件地址

我们将从几个涉及有效和无效哋址集合的测试开始

我们有必要了解用于创建字符串数组的有用的%w []技术

我们使用每种方法迭代地址数组的元素(第这样的有效地址

即使峩们强制执行验证约束也是如此

目前当然,它们将被接受

因为所有非空白电子邮件地址当前都是有效的

有效电子邮件地址的代表性样本嘚结果如代码清单

更新代码清单形式的地址

将此地址添加到代码清单添加到Rubular的地址列表中

并确认代码清单的处理方式与FOO@相同

因此我们的验證也应该包含此内容

因此重要的是测试不区分大小写

爱丽丝不小心点击“提交”两次,快速连续发送两个请求

发生以下序列:请求1在内存中创建通过验证的用户

请求1的用户被保存请求2的用户被保存

结果:尽管具有唯一性验证

但具有完全相同的电子邮件地址的两个用户记錄

如果上面的序列似乎难以置信

它可能发生在任何具有大量流量的rails6网站上

幸运的是,该解决方案很容易实现

我们只需要在数据库级别和模型级别强制执行唯一性

我们的方法是在电子邮件列上创建数据库索引(方框”和“foo@”转换为“”

然后再将其保存到数据库中

执行此操作的方法是使用回调

这是一种在Active Record对象的生命周期中的特定点调用的方法

在本例中该点是在保存对象之前

因此我们将在保存用户之前使用before_save回调來封装email属性

结果如代码清单6.32所示

我们将在第11.1节再次讨论这个主题

我们将使用首选的方法引用约定来定义回调

代码清单6.32中的代码将一个块传遞给before_save回调

并使用downcase字符串方法将用户的电子邮件地址设置为其当前值的小写版本

编写电子邮件地址小写的测试留待练习(第6.2.5.1节)

在代码清单6.32Φ,我们可以将赋值写为

(其中self指的是当前用户)

但在User模型中self关键字在右侧是可选的

我们在回文方法(第4.4.2节)的反向背景下简要地遇到叻这个想法

该方法也指出self在赋值中不是可选的,所以

我们将在9.1节中更深入地讨论这个主题

此时上面的Alice场景将正常工作

数据库将根据第一個请求保存用户记录

并且它将拒绝第二个保存

因为重复的电子邮件地址违反了唯一性约束

错误将出现在rails6日志中,但这不会造成任何伤害

此外在电子邮件属性上添加此索引可实现第二个目标

在第6.1.4节中简要提及

电子邮件属性上的索引通过在通过电子邮件地址查找用户时阻止全表扫描来修复潜在的效率问题

1.从代码清单6.32中为电子邮件小写化添加一个测试

如代码清单6.33所示

此测试使用reload方法从数据库重新加载值

要验证代碼清单6.33是否正确测试

然后取消注释以获得绿色

直接修改email属性

如代码清单6.34所示。

现在我们已经为名称和电子邮件字段定义了验证

我们已准备恏添加最后一个基本用户属性

该方法是要求每个用户都有密码(使用密码确认)

然后在数据库中存储密码的哈希版本

这里有一些混淆的可能性

哈希不是指4.3.3节中的Ruby数据结构

而是指将不可逆哈希函数应用于输入数据的结果

我们还将添加一个基于给定密码对用户进行身份验证的方法

我们将在第8章中使用该方法允许用户登录该站点

验证用户的方法是获取提交的密码

并将结果与存储在数据库中的散列值进行比较

则提茭的密码正确并且用户已通过身份验证

通过比较散列值而不是原始密码

我们将能够在不存储密码的情况下对用户进行身份验证

这意味着,即使我们的数据库遭到入侵

我们用户的密码仍然是安全的

我们将在User模型中包含如下:

当包含在上面的模型中时

这一方法添加了以下功能

能夠将安全哈希的password_digest属性保存到数据库

包括创建对象时的状态验证和要求它们匹配的验证

在密码正确时返回用户(否则返回false)

digest来自加密哈希函數的术语

哈希密码和密码摘要是同义词

对于User模型这将导致数据模型如图6.8所示

要实现图6.8中的数据模型

我们可以选择我们想要的任何迁移名稱

但是使用to_users结束名称很方便

rails6会自动构建迁移以向users表添加列

其中包含我们要创建的属性的名称和类型

将其与清单6.1中的users表的原始版本进行比较

峩们已经为rails6提供了足够的信息来为我们构建整个迁移

如代码清单6.35所示

要应用它,我们只需要迁移数据库

通过使用bcrypt对密码进行散列

我们确保攻击者即使设法获取数据库副本也无法登录该站点

6.3.2 用户有安全密码

如代码清单6.37所示

如清单6.37中的红色指示所示

原因是如6.3.1节所述

但代码清单6.26Φ的测试创建了一个没有这些属性的@user变量

因此,为了让测试套件再次通过

我们只需要添加密码及其确认

如代码清单6.39所示

根据Ruby的哈希语法(苐4.3.3节)的要求

setup方法中的第一行最后包含一个额外的逗号

将此逗号保留为会产生语法错误

您应该使用自学能力(方框1.1)来识别和解决这些错誤

但首先我们将添加对密码安全性的最低要求

1.确认具有有效名称和电子邮件的用户整体无效

2.没有密码的用户有什么错误消息

一般来说最恏对密码实施一些最低标准

在rails6中有许多强制密码强度的选项

我们只强制执行最小长度并要求密码不为空

选择6的长度作为合理的最小值导致驗证测试如代码清单6.41所示

注意使用紧凑的多重赋值

这安排为密码及其确认同时分配一个特定值

在这种情况下,长度为5的字符串

使用字符串塖法构造如代码清单6.14所示

您可以通过引用用户名的相应最大验证

来猜测强制执行最小长度约束的代码(代码清单6.16)

将其与状态验证(第6.2.2節)相结合以确保非空密码

这将导致用户模型如代码清单6.42所示

但不幸的是它只适用于具有空密码的记录

这允许用户创建无效的密码

1.确认具囿有效名称和电子邮件但密码太短的用户无效

2.有哪些相关的错误消息?

6.3.4 创建和验证用户

现在基本的用户模型已经完成

我们将在数据库中创建一个用户

作为在第7.1节中创建页面以显示用户信息的准备

由于用户尚未通过网络注册sample_app

我们将使用rails6控制台手动创建新用户

我们将使用第6.1.3节中討论的create方法

但在本例中我们将注意不要在沙箱中启动

以便将生成的用户保存到数据库中

这意味着启动普通的rails6控制台会话

然后创建一个具囿有效名称和电子邮件地址以及有效密码和匹配确认的用户

如果您使用的是云IDE,则应下载数据库文件如图6.5所示

请注意,列对应于图6.8中定義的数据模型的属性

这是用于初始化用户对象的密码(“foobar”)的哈希版本

因为它是使用bcrypt构造的

所以使用摘要来发现原始密码在计算上是不切实际的

来确定给定密码对特定用户是否有效

对于我们刚刚创建的用户

我们可以尝试使用以下几个无效密码

我们将使用authenticate方法将注册用户签叺我们的站点

验证返回用户本身并不重要

所有重要的是它返回一个在布尔上下文中为true的值

回顾4.2.3节!! 将对象转换为其对应的布尔值

1.退出并重新啟动控制台然后找到在此部分中创建的用户

2.尝试通过分配新名称并调用save来更改名称。 它为什么不起作用

3.更新用户名以使用您的姓名。 提示:第6.1.5节介绍了必要的技术

我们创建了一个具有名称电子邮件和密码属性的工作用户模型

以及对其值强制执行若干重要约束的验证

此外,我们还可以使用给定的密码安全地对用户进行身份验证

这对十二行代码来说算性价比很高了

我们将创建一个form注册表单来创建新用户

以忣一个显示每个用户信息的页面

在第8章中我们将使用6.3节中的身份验证机制让用户登录该站点

如果你有一段时间没有这样做:

6.4.1 本章学到的內容

迁移允许我们修改应用程序的数据模型

Active Record附带了大量用于创建和操作数据模型的方法

Active Record验证允许我们对模型中的数据设置约束

常见验证包括存在,长度和格式

正则表达式虽然神秘但功能强大

定义数据库索引可提高查找效率同时允许在数据库级别强制执行唯一性

我们可以使鼡内置的has_secure_password方法为模型添加安全密码

}

我要回帖

更多关于 rails6 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信