Здравствуйте , работаю над проектом на zf2+doctrine. Для авторизации использую модуль zfcuser, для разделения прав доступа(ACL) bjyauthorize.
Создаю кастомную форму для изменения пароля:
<?php
namespace Application\Form;
use Zend\Form\Form;
class ClientpassForm extends Form{
public function __construct($em){
parent::__construct('security');
$this->add(array(
'name' => 'password-old',
'attributes' => array(
'type' => 'password',
'placeholder' => 'пароль',
'id' => 'key',
'class' => ''
),
'options' => array(
'label' => 'Введите ваш старый пароль',
'label_attributes' => array(
'class' => ''
),
),
));
$this->add(array(
'name' => 'password',
'attributes' => array(
'type' => 'password',
'placeholder' => 'новый пароль',
'id' => 'key',
'class' => ''
),
'options' => array(
'label' => 'Введите новый пароль',
'label_attribute' => array(
'class' => ''
),
),
));
$this->add(array(
'name' => 'password-confirm',
'attributes' => array(
'type' => 'password',
'placeholder' => 'новый пароль',
'id' => 'key',
'class' => ''
),
'options' => array(
'label' => 'Повторите новый пароль',
'label_attributes' => array(
'class' => ''
),
),
));
}
}
и фильтр к форме:
<?php
namespace Application\Form;
use Zend\InputFilter\Factory as InputFactory;
use Zend\InputFilter\InputFilter;
class ClientpassFilter extends InputFilter{
public function __construct($sm){
$this->add(array(
'name' => 'password',
'filters' => array(
array('name' => 'StripTags'),
array('name' => 'StringTrim'),
),
'validators' => array(
array(
'name' => 'StringLength',
'options' => array(
'encoding' => 'UTF-8',
'min' => 4,
'max' => 100,
),
),
),
));
$this->add(array(
'name' => 'password-old',
'filters' => array(
array('name' => 'StripTags'),
array('name' => 'StringTrim'),
),
'validators' => array(
array(
'name' => 'StringLength',
'options' => array(
'encoding' => 'UTF-8',
'min' => 4,
'max' => 100,
),
),
),
));
$this->add(array(
'name' => 'password-confirm',
'filters' => array(
array('name' => 'StripTags'),
array('name' => 'StringTrim'),
),
'validators' => array(
array(
'name' => 'StringLength',
'options' => array(
'encoding' => 'UTF-8',
'min' => 4,
'max' => 100,
),
),
array(
'name' => 'Identical',
'options' => array(
'token' => 'password',
'messages' => array(
\Zend\Validator\Identical::NOT_SAME => 'Введенные пароли не совпадают'
),
),
),
),
));
}
}
Контроллер(action изменения пароля):
public function securityAction(){
$this->getServiceLocator()->get('Zend\View\Renderer\PhpRenderer')->headTitle('Изменение данных пользователя');
$em = $this->getEntityManager();
$form = new \Application\Form\ClientpassForm($em);
return new ViewModel(array(
'form' => $form,
));
}
И напоследок view:
<?=$this->form()->openTag($form);?>
<?=$this->formRow($form->get('password-old'));?>
<br/>
<?=$this->formRow($form->get('password'));?>
<br/>
<?=$this->formRow($form->get('password-confirm'));?>
<br/>
<button type="submit">Сохранить</button>
<?=$this->form()->closeTag();?>
Не могу связать форму с модулем.
Можно было бы обойти модуль zfcuser просто сверив старый пароль формы с базой, но используется Zend\Crypt\Password\Bcrypt для шифрования пароля и каждый раз при шифровании соответственно разная выходная строка. Изменить метод шифрования нельзя, уже есть пользователи.
Форма регистрации работает редиректом(auth action):
if ($request->isPost())
return $this->forward()->dispatch('zfcuser', array('action' => 'authenticate'));
С формой изменения пароля такой трюк не проходит.
Есть какие-либо варианты решения данной проблемы? Спасибо, что дочитали до конца.