Что вы можете сделать, так это создать Password
DataObject
с объектом Member
, имеющим отношение один ко многим к объекту Password
. Вы можете использовать соль зарегистрированного участника с двухсторонней функцией шифрования php для шифрования и расшифровки пароля.
В этом примере кода используется php mcrypt с солью члена для шифрования и расшифровки пароля.
Класс пароля имеет описание, URL-адрес, имя пользователя и пароль. Он содержит функцию для шифрования данной строки с использованием данного ключа. Он также содержит функцию расшифровки для расшифровки сохраненного пароля с использованием соли подключенного члена.
Класс пароля
<?php
class Password extends DataObject
{
static $db = array (
'Description' => 'Text',
'URL' => 'Text',
'Username' => 'Text',
'Password' => 'Text'
);
static $has_one = array (
'Member' => 'Member'
);
public function decryptedPassword() {
return rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($this->Member()->Salt), base64_decode($this->Password), MCRYPT_MODE_CBC, md5(md5($this->Member()->Salt))), "\0");
}
public function encryptPassword($key, $password) {
return base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), $password, MCRYPT_MODE_CBC, md5(md5($key))));
}
}
Нам нужно расширить объект Member, чтобы иметь связь has_many с объектом Password:
MemberPasswordListExtension
<?php
class MemberPasswordListExtension extends DataExtension {
private static $has_many = array(
'Passwords' => 'Password'
);
}
Это необходимо в вашей конфигурации, чтобы добавить расширение:
_config.php
...
Member::add_extension('Member', 'MemberPasswordListExtension');
...
Ниже представлена форма для добавления пароля. При отправке мы шифруем пароль, используя соль члена и функцию шифрования из класса Password.
Контроллер страницы
...
public function AddPasswordForm() {
// Create fields
$fields = new FieldList(
new TextField('Description'),
new TextField('URL'),
new TextField('Username'),
new TextField('Password')
);
// Create actions
$actions = new FieldList(
new FormAction('AddPassword', 'Submit')
);
return new Form($this, 'AddPasswordForm', $fields, $actions);
}
public function AddPassword($data, $form) {
if($member = Member::currentUser()) {
$password = new Password();
$form->saveInto($password);
$password->MemberID = $member->ID;
$password->Password = $password->encryptPassword($member->Salt, $password->Password);
$password->write();
}
return $this->redirectBack();
}
...
В шаблоне страницы мы вызываем форму и перебираем пароли, сохраненные под этим пользователем. Мы отображаем имя пользователя, зашифрованный пароль и расшифрованный пароль, просто чтобы показать нам, что это сработало:
Шаблон Page.ss
...
<% if $CurrentMember %>
$AddPasswordForm
<% end_if %>
<% with $CurrentMember %>
<h3>Passwords</h3>
<% if $Passwords %>
<ul>
<% loop $Passwords %>
<li>$Username $Password $DecryptedPassword</li>
<% end_loop %>
</ul>
<% else %>
<p>No passwords saved</p>
<% end_if %>
<% end_with %>
...
Это должно дать вам основу для того, что вы хотите сделать, и вы должны иметь возможность изменить ее в соответствии со своими потребностями.
Метод шифрования был взят из этого ответа stackoverflow: Простейшее двустороннее шифрование с использованием PHP< /а>
Вы можете легко заменить другой метод шифрования/дешифрования остальной частью этого кода по своему желанию.
person
3dgoo
schedule
02.10.2013