gvi*_*iew 2 php validation symfony
我一直在寻找我的Symfony2验证选项.问题是这样的:
我有一个在setPassword方法中哈希密码的Member类:
public function setPassword($password)
{
$this->password = Encrypt::cryptPassword($password);
}
Run Code Online (Sandbox Code Playgroud)
散列是一个长字符串,无论原始输入如何都存在.
出于这个原因,这样的验证是无用的:
* @Assert\NotBlank()
* @Assert\Length(
* min = "8",
* max = "15",
* minMessage = "Your password must be at least {{ limit }} characters",
* maxMessage = "Your password cannot be longer than {{ limit }} characters"
* )
Run Code Online (Sandbox Code Playgroud)
触发验证是因为无论输入的有效性如何都会创建哈希字符串.
我看了尝试getter验证,但这似乎也是一个死路一条,因为我真正想要验证的是setPassword()的原始输入,并且在setPassword创建了一个hash值之后得到了hash值很有帮助.
推荐的方法是什么,它与现有的Validation组件一起使用,可以让我验证原始用户输入?
更新
虽然我接受了答案,但它并不可行.它确实让我专注于生命周期回调系统,这可能是解决方案的一部分.
根据当前的建议,一旦第一次对密码进行编码,每次尝试编辑实体时都会超过验证,因为散列密码当然不是输入,也不能解密为原始输入.
我现在正在试验实体中的单独属性,纯粹是为了输入密码,以及使用验证组来触发在某些情况下使用验证(新用户创建/密码更改),而在其他情况下省略它案例.我计划使用prePersist和preUpdate回调来进行密码编码.
仅供记录,这是在提供REST API的应用程序中使用,以及管理工具和所选功能的Web前端.
Syb*_*bio 12
使用doctrine lifecycles,永远不要修改setter的行为!
<?php
// ...
/**
* @ORM\Entity()
* @ORM\HasLifecycleCallbacks()
*/
class Member
{
public function setPassword($password)
{
$this->password = $password;
}
/**
* @ORM\PrePersist
*
* First time you save the entity
*/
public function prePersist()
{
$this->password = Encrypt::cryptPassword($this->password);
}
}
Run Code Online (Sandbox Code Playgroud)
在此示例中,在保存成员对象之前,密码不会被编码,因此可以通过断言进行验证!
但是,Symfony2安全性附带了一个防火墙,可以加密成员的密码,只需为您完成工作:
http://symfony.com/doc/current/book/security.html#encoding-the-user-s-password
| 归档时间: |
|
| 查看次数: |
645 次 |
| 最近记录: |