Yang dapat Anda lakukan adalah membuat Password
DataObject
dengan Member
objek yang memiliki hubungan satu ke banyak dengan Password
obyek. Anda dapat menggunakan garam dari Anggota yang masuk dengan fungsi enkripsi php 2 arah untuk mengenkripsi dan mendekripsi kata sandi.
Kode contoh ini menggunakan php mcrypt dengan garam anggota untuk mengenkripsi dan mendekripsi kata sandi.
Kelas kata sandi memiliki deskripsi, url, nama pengguna, dan kata sandi. Ini berisi fungsi untuk mengenkripsi string yang diberikan menggunakan kunci yang diberikan. Ini juga berisi fungsi dekripsi untuk mendekripsi kata sandi yang disimpan menggunakan garam anggota yang terhubung.
Kelas sandi
<?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))));
}
}
Kita perlu memperluas objek Anggota untuk memiliki hubungan has_many dengan objek Kata Sandi:
MemberPasswordListExtension
<?php
class MemberPasswordListExtension extends DataExtension {
private static $has_many = array(
'Passwords' => 'Password'
);
}
Ini diperlukan dalam konfigurasi Anda untuk menambahkan ekstensi:
_config.php
...
Member::add_extension('Member', 'MemberPasswordListExtension');
...
Berikut ini adalah form untuk menambahkan password. Saat pengiriman, kami mengenkripsi kata sandi menggunakan garam anggota dan fungsi enkripsi dari kelas Kata Sandi.
Pengontrol_Halaman
...
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();
}
...
Di templat halaman, kami memanggil Formulir dan mengulang kata sandi yang disimpan di bawah pengguna ini. Kami menampilkan nama pengguna, kata sandi terenkripsi, dan kata sandi yang didekripsi, hanya untuk menunjukkan kepada kami bahwa ini berhasil:
Template 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 %>
...
Ini akan memberi Anda dasar untuk apa yang ingin Anda lakukan, dan Anda harus dapat mengubahnya sesuai kebutuhan Anda.
Metode enkripsi diambil dari jawaban stackoverflow ini:Sederhana enkripsi dua arah menggunakan PHP
Anda dapat dengan mudah mengganti metode enkripsi/dekripsi yang berbeda dengan sisa kode ini sesuai keinginan.