最初使用symfony表单构建器创建了一个正常的注册表单(电子邮件+密码),我发现注册我的用户没有任何问题。
对于一些技术问题和战略性的东西,我不再使用symfony表单构建器,我只是制作了一个常见的html表单。用户名,盐和密码保存在数据库中,但是当我尝试登录时它不起作用,所以密码或盐是错误的,这让我觉得可能是使用令牌发送创建的盐作为由隐藏字段创建的symfony表单构建器,我是对的吗?
因此,最初因为symfony表单构建器允许您将数据直接解析为实体,所以我做了类似这样的事情:
if( 'POST' === $this->getRequest( )->getMethod() ) {
$form->bindRequest( $this->getRequest( ) );
if( $form->isValid( ) ) {
$userSignup = $form->getData( );
$user = $userSignup->getUser( );
$user->setPassword( $this->_encodePassword( $user ) );
现在,因为我使用的是普通形式:
if(isset($_GET['user_signup']['user']['username']) && $this->_validemail($_GET['user_signup']['user']['username'])) $username = $_GET['user_signup']['user']['username']; else die('BAD EMAIL');
if(isset($_GET['user_signup']['user']['password']) && strlen($_GET['user_signup']['user']['password']) >= 5 && strlen($_GET['user_signup']['user']['password']) <= 20) $password = $_GET['user_signup']['user']['password']; else die('BAD PASSWORD');
$user = new user();
$user->setUsername($username);
$user->setPassword( $this->_encodePassword( $user ) );
encodePassword函数:
protected function _encodePassword( User $user )
{
$factory = $this->get( 'security.encoder_factory' );
$encoder = $factory->getEncoder( $user );
return $encoder->encodePassword( $user->getPassword( ), $user->getSalt( ) );
}
我正在利用别人的代码,所以也许我无法理解encodePassword的工作原理。
答案 0 :(得分:0)
如果您希望在Web应用程序中安装注册系统FOSUserBundle。
然后您可以使用userManager创建,注册和编辑任何用户。
答案 1 :(得分:-1)
你应首先创建一个盐(使用一些随机函数)并在你的控制器中使用$user->setSalt($salt)
......
...或在用户的__construct()
方法中生成salt。
FOSUserBundle即使用以下方法在User对象的构造函数中创建salt:
public function __construct()
{
$this->salt = base_convert(sha1(uniqid(mt_rand(), true)), 16, 36);
// ...
}
参考here。
否则,$this->_encodePassword($user)
处调用的编码器将找不到调用用户对象的getter getSalt()
的salt。
提示强>
在symfony2中,您绝不应尝试使用GET
来访问$_GET
个参数...
...改为使用Request对象。
请阅读本书的Symfony2 and HTTP Fundamentals章节。