Er is een inlogscherm waar je kunt inloggen en als je je wachtwoord niet meer weet een nieuw wachtwoord aan kunt vragen, en er is een admin gedeelte dat controleert of de gebruiker rechten heeft om op de pagina te zijn, en waar de gebruiker zijn gegevens kan aanpassen.
Nu heb ik vanaf het begin af aan mijn hoofd zitten breken over de inlog pagina, omdat er zoveel opties zijn.
er kunnen een session variabelen zijn die gecontroleerd moeten worden (als er al ingelogd is) en er kunnen post variabelen zijn die gecontroleerd moeten worden (als er ingelogd word).
In beide gevallen kunnen zich dan de volgende situaties voordoen:
- email adres komt niet in db voor
- wachtwoord komt niet overeen met wachtwoord in db
- beide komen overeen en de gebruiker is ingelogd
Nu heb ik een abstract class LoginHandler gemaakt die het email adres en het wachtwoord controleert, waarbij de child classes voor post en session variabelen bepalen wat de uiteindelijke actie is die ondernomen moet worden.
Maar, als iemand zijn wachtwoord vergeten is en op de link 'wachtwoord vergeten' klikt, heb ik weer een deel van de functionaliteit van de LoginHandler class nodig. Voordat ik namelijk een nieuw wachtwoord aan kan maken en kan mailen, moet ik wel weten of het email adres in de database voorkomt. De functie daarvoor staat al in LoginHandler. Maar, in de child class zou ik dan maar 2 van de 4 abstract functions hoeven te gebruiken. Wat een foutmelding oplevert. Ik kan natuurlijk 2 lege functies in de child class zetten, maar deze hele situatie maakt dat ik me ernstig afvraag of ik het überhaupt niet helemaal verkeerd heb aangepakt.
Mijn vraag, lijkt dit ergens op en zo nee, hoe kan ik dit beter aanpakken?
De abstract class LoginHandler:
<?php
abstract class LoginHandler {
/**
* ingevoerde gebruikersnaam
*/
private $invoeremail;
/**
* ingevoerd wachtwoord
*/
private $invoerwachtwoord;
/**
* ingevoerde naam gebruiker
*/
private $db_handler;
/**
* prefix die gebruikt wordt voor unieke tabelnamen in database, uit settings
*/
private $prefix;
/**
* constructor die de inloggegevens verwerkt
*/
public function __construct( $prefix, DatabaseHandler $db_handler, $invoeremail, $invoerwachtwoord ){
$this->prefix = $prefix;
$this->db_handler = $db_handler;
$this->invoeremail = $invoeremail;
$this->invoerwachtwoord = $invoerwachtwoord;
}
/**
* controleer of het email adres voorkomt in de database
*/
public function check_login(){
$this->velden = array( "gebruikers_email", "gebruikers_ID" );
$this->db_handler->select_single ( $this->prefix . 'Gebruikers', $this->velden, 'gebruikers_email', $this->invoeremail );
$this->gebruikers_email = $this->db_handler->get_single( "gebruikers_email" );
$this->gebruikers_ID = $this->db_handler->get_single( "gebruikers_ID" );
if ( !empty( $this->gebruikers_email ) && !empty( $this->gebruikers_ID ) ){
//het email adres staat in de database, controleer nu het wachtwoord
return $this->email_match();
} else {
//het email adres staat niet in de database
return $this->geen_email_match();
}
}//end function check_email()
/**
* controleer of het wacthwoord overeenkomt met het ingevulde wachtwoord
*/
public function check_wachtwoord() {
$this->velden = array( "gebruikers_email", "gebruikers_ID", "gebruikers_wachtwoord" );
$this->db_handler->select_single ( $this->prefix . 'Gebruikers', $this->velden, 'gebruikers_email', $this->gebruikers_email );
$this->gebruikers_wachtwoord = $this->db_handler->get_single( "gebruikers_wachtwoord" );
$this->gebruikers_ID = $this->db_handler->get_single( "gebruikers_ID" );
if ( password_verify( $this->invoerwachtwoord, $this->gebruikers_wachtwoord )) {
//wachtwoorden komen overeen, stel de session variabelen in en redirect naar de juiste pagina
return $this->inlog_match();
} else {
//wachtwoorden komen niet overeen
return $this->geen_wachtwoord_match();
}
}//end function check_wachtwoord()
abstract function geen_email_match();
abstract function email_match();
abstract function inlog_match();
abstract function geen_wachtwoord_match();
}//end class Login_Handler
?>
Child class LoginHandlerWachtwoord (bij vergeten wachtwoord)
<?php
/**
* child class de uitvoer van een verloren wachtwoord regelt
*/
class LoginHandlerWachtwoord extends LoginHandler {
/**
* als het email adres overeenkomt met dat in de database worden de gegevens opgeslagen en het wachtwoord hersteld
*/
public function email_match(){
$_SESSION[ 'vergetenwachtwoordid' ] = $this->gebruikers_ID;
$_SESSION[ 'vergetenwachtwoordemail' ] = $this->gebruikers_email;
$this->fout = 'wachtwoordherstellen.php';
return $this->fout;
}//end function email_match
/**
* als het email adres niet in de database voorkomt wordt het inlogscherm getoond met bijbehorende foutmelding
*/
public function geen_email_match(){
$this->fout = '../index.php?fout=1';
return $this->fout;
}//end function geen_email_match
private function inlog_match(){
//lege functie omdat ik hem niet gebruikt in deze situatie
}
private function geen_wachtwoord_match(){
//lege functie omdat ik hem niet gebruikt in deze situatie
}
}//end class LoginHandlerWacthwoord
?>