Symfony - 通过不包含密码字段的表单对部分用户实体更新的尴尬密码长度违规

Posted

技术标签:

【中文标题】Symfony - 通过不包含密码字段的表单对部分用户实体更新的尴尬密码长度违规【英文标题】:Symfony - awkward Password Length violation on partial User entity update through a form containing no password field 【发布时间】:2020-10-11 16:48:20 【问题描述】:

在 Symfony 5.1 项目中,我有一个缩进以部分更新用户实体记录的表单(除了密码和电子邮件之外的某些字段)。 表单是使用 FormBuilder 类生成的 - 扩展 UserType 类的子类,从构建器中删除了“密码”:

class UserProfileSubType extends UserType 
public function buildForm(FormBuilderInterface $builder, array $options) 
    parent::buildForm($builder, $options);
    
    $builder->remove('email')
            ->remove('password');

感谢 Twig 模板生成的 html 表单不包含“密码”字段。

但是,由于“密码不能超过 20 个字符”,表单实际上验证失败。事实上,我在用户实体中有这个断言:

 * @Assert\Length(
 *      max = 20,
 *      maxMessage = "Password cannot be longer than  limit  characters."
 * )

关键是散列密码确实长于 20 个字符。例如。: $argon2id$v=19$m=65536,t=4,p=1$c21aeTNTbmsNL3dsaT3Y4RQ$E1B0bBI/SPjpIOItOFN2xs1d131YWTtDCw79n4fXJE

出于测试目的,当我将长度断言修改为max = 100, 时,问题消失了(已解决),因为散列密码长度为 97 个字符。然而,为什么要根据密码长度验证表单?

有什么办法可以避免密码最大长度值较低的表单验证错误?

【问题讨论】:

【参考方案1】:

默认验证组意味着验证所有实体验证约束。在您的情况下,您可以定义自定义验证组,您可以在其中定义单独的验证规则。

查看带有注册示例https://symfony.com/doc/current/validation/groups.html的文档

【讨论】:

谢谢!这部分解决了这个问题。但显然产生了另一个问题:使用这些组应用* @Assert\NotBlank(message= "Family Name cannot be blank", groups="Default","profile_update")* @Assert\Regex(pattern="/^[\pL\-. ']*$/u", message= "Numbers and some special characters are not allowed.", groups="Default","profile_update")`*/``private $familyName;`NotBlank 验证不再起作用(允许空格条目进入表单并抛出:预期参数类型"string", "null" given) 你知道为什么吗? 如何针对您的验证组指定验证?您可能需要在表单中设置或创建表单:symfony.com/doc/current/form/validation_groups.html 我做到了,而且效果很好。提到的问题与这个问题无关 - 它不是以前的验证问题,但它被抛出 $form->handleRequest($request) 。它在这里描述:link 所以这个话题已经结束了 - 再次感谢。 为了清楚起见 - 我将这个添加到 familyName 字段构建器中:'empty_data' => '', 它解决了“类型为“字符串”的预期参数,给定“null” " 错误

以上是关于Symfony - 通过不包含密码字段的表单对部分用户实体更新的尴尬密码长度违规的主要内容,如果未能解决你的问题,请参考以下文章

Symfony 表单验证:如果另一个字段不为空,则需要字段

如何从子表单中获取父 Symfony3 表单的值?

Symfony 2 搜索表单呈现一个不需要的搜索字段。我可以禁用此行为吗?

Symfony2 - 如何阻止 Form->handleRequest 清空帖子数据中不存在的字段

Symfony 2表单字段收音机需要=假?

如何使用 EntityType 字段对 Symfony 4 表单进行单元测试