Wat je zou kunnen doen is een Password
. aanmaken DataObject
met het Member
object dat een één-op-veel relatie heeft met het Password
object. U kunt de salt van het ingelogde lid gebruiken met een 2-weg php-coderingsfunctie om een wachtwoord te coderen en te decoderen.
Deze voorbeeldcode gebruikt php mcrypt met het lidzout om het wachtwoord te coderen en te decoderen.
De wachtwoordklasse heeft een beschrijving, een url, gebruikersnaam en wachtwoord. Het bevat een functie om een gegeven string te versleutelen met een bepaalde sleutel. Het bevat ook een decoderingsfunctie om het opgeslagen wachtwoord te decoderen met behulp van het aangesloten lidzout.
Wachtwoordklasse
<?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))));
}
}
We moeten het Member-object uitbreiden om een has_many-relatie te hebben met het Password-object:
MemberPasswordListExtension
<?php
class MemberPasswordListExtension extends DataExtension {
private static $has_many = array(
'Passwords' => 'Password'
);
}
Dit is nodig in uw configuratie om de extensie toe te voegen:
_config.php
...
Member::add_extension('Member', 'MemberPasswordListExtension');
...
Het volgende is een formulier om een wachtwoord toe te voegen. Bij indiening versleutelen we het wachtwoord met behulp van het lidzout en de versleutelingsfunctie van de wachtwoordklasse.
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();
}
...
In de paginasjabloon noemen we het formulier en doorlopen we de wachtwoorden die onder deze gebruiker zijn opgeslagen. We tonen de gebruikersnaam, het versleutelde wachtwoord en het ontsleutelde wachtwoord, om ons te laten zien dat dit heeft gewerkt:
Page.ss-sjabloon
...
<% 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 %>
...
Dit zou u een basis moeten geven voor wat u wilt doen, en u zou het moeten kunnen aanpassen aan uw behoeften.
De coderingsmethode is overgenomen van dit stackoverflow-antwoord:Eenvoudigst tweerichtingsversleuteling met PHP
U kunt de rest van deze code gemakkelijk vervangen door een andere codeer-/decodeermethode, zoals u wenst.