Что вы можете сделать, это создать Password
DataObject
с объектом Member
, имеющим отношение «один ко многим» к объекту Password
. Вы можете использовать соль зарегистрированного участника с помощью двухсторонней функции шифрования php для шифрования и дешифрования пароля.
В этом примере кода используется php mcrypt с солью-членом для шифрования и дешифрования пароля.
Класс пароля содержит описание, адрес, имя пользователя и пароль. Он содержит функцию для шифрования данной строки с использованием заданного ключа. Он также содержит функцию дешифрования для дешифрования сохраненного пароля с использованием связанной соли членов.
класс Пароль
<?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))));
}
}
Нам необходимо расширить объект членам иметь отношения has_many с объектом Пароль:
MemberPasswordListExtension
<?php
class MemberPasswordListExtension extends DataExtension {
private static $has_many = array(
'Passwords' => 'Password'
);
}
Это необходимо в вашей конфигурации, чтобы добавить расширение:
_config.php
...
Member::add_extension('Member', 'MemberPasswordListExtension');
...
Ниже приводится форма для добавления пароля. При представлении мы шифруем пароль, используя соль члена и функцию шифрования из класса Password.
Page_Controller
...
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 ответа: Simplest two-way encryption using PHP
Вы можете легко заменить другой шифровать/дешифровать метод с остальной частью этого кода, как вы хотите.
Сохранение данных паролей с обратимым хэшем немного противоречит идее его безопасности? Решением может быть использование ключа шифрования, но если этот ключ взломан, все ваши данные скомпрометированы, особенно потому, что этот ключ должен быть доступен сервером в любое время, поэтому под угрозой. – colymba
Почему вы хотите назовите это в своем шаблоне? Вы хотите отобразить пароль для пользователя? Или просто проверьте, правильно ли введен пароль? – 3dgoo
Я хочу показать его пользователю, если он ему нужен. например, пароль ftp. не хорошая идея? – invictus