php.de

Zurück   php.de > Webentwicklung > Software-Design

Software-Design Diskussionen auf Profi-Niveau: PHP Lösungen auf konzeptioneller Ebene

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 19.12.2011, 18:31  
archer42
Gast
 
Beiträge: n/a
Standard Strukturverbesserung Authentifizierung, Kernelemente eines Projekts

Hallo,
ich "arbeite" mit PHP seit einigen Wochen und habe vor kurzem den Schritt in die OOP gefunden. Aufgrund von fehlender Erfahrung habe ich "enorme" Defizite im Bereich der Strukturierung von OOP Projekten. Nunja, diese Defizite gedenke ich mit üben auszugleichen.

Als erstes wollte ich mich an einen erweiterbaren Authentifizierungsdienst arbeiten, welche später in ein MVC intergriert werden soll.

Der bisheriger Ansatz sieht wie folgt aus:
userRepository
+ findeOneBy($user, $hash, $state)
+ findManyByStat($stat)
+ findManyByHash($hash)
+ update($user, $hash)
+ insert($user, $hash, $state)
+ delete($user, $hash, $state)

sessionController
+ private keygen
+ initiateSession
+ validateSession
+ endSession

userAuthentification
+ authentUser

In der Umsetzung sieht das wie folgt aus:
PHP-Code:
<?php namespace Authentificationcore;

class 
userRepository {
    private 
$db;
        
    public function 
__construct($pdo) {
        
$this->db $pdo;
    }
    
    public function 
__destruct() {
        
$this->db NULL;
    }
    
    public function 
findOneBy($user$hash$stat) {
        
$stmt $this->db->prepare('SELECT user, hash, status FROM user WHERE user = :user AND hash = :hash AND status = :stat');
        
$stmt->bindParam(':user'$user);
        
$stmt->bindParam(':hash'$hash);
        
$stmt->bindParam(':stat'$stat);
        
$stmt->execute();
        return 
$stmt->fetch();
    }
    
    public function 
findManyByStat($stat) {
        
$stmt $this->db->prepare('SELECT status FROM user WHERE status = :stat');
        
$stmt->bindParam(':stat'$stat);
        
$stmt->execute();
        return 
$stmt->fetch();
    }
        
    public function 
findManyByHash($hash) {
        
$stmt $this->db->prepare('SELECT hash FROM user WHERE hash = :hash');
        
$stmt->bindParam(':hash'$hash);
        
$stmt->execute();
        return 
$stmt->fetch();
    }
    
    private function 
update($id$user$hash$stat) {
        
$stmt $this->db->prepare('UPDATE user SET user = :user, hash = :hash, stat = :stat WHERE id = :id');
        
$stmt->bindParam(':id'$id);
        
$stmt->bindParam(':user'$user);
        
$stmt->bindParam(':hash'$hash);
        
$stmt->bindParam(':stat'$stat);
        
$stmt->execute();
        return 
$stmt->fetch();
    }
    
    public function 
insert($user$hash$state) {
        
$stmt $this->db->prepare('INSERT INTO user (user, hash, status) VALUES (:user, :hash, :state)');
        
$stmt->bindParam(':user'$user);
        
$stmt->bindParam(':hash'$hash);
        
$stmt->bindParam(':stat'$stat);
        
$stmt->execute();
        return 
$stmt->fetch();
    }

    public function 
delete($id) {
        
$stmt $this->db->prepare('UPDATE user SET status = 0 WHERE id = :id');
        
$stmt->bindParam(':id'$id);
        
$stmt->execute();
        return 
$stmt->fetch();
    }

}

?>
PHP-Code:
<?php namespace Authentificationcore;


class 
session {
    private 
$key;
    
    private function 
keygen() {
        
$extension  hash('SHA512''?PH6gzUrt#*');
        
$keywrapper str_split($extension64);
        
$legiblekey $keywrapper[0].$_SERVER['HTTP_USER_AGENT'].$keywrapper[1];
        
$this->key  hash('SHA512'$legiblekey);
    }
    
    public function 
initiateSession() {
        
$this->keygen();
        
$_SESSION['key']   = $this->key;
        
$_SESSION['date']  = date('m.d.Y H:i:s');
        
$_SESSION['ip']    = $_SERVER['REMOTE_ADDR'];
        
$_SESSION['host']  = $_SERVER['REMOTE_HOST'];
        
$_SESSION['agent'] = $_SERVER['HTTP_USER_AGENT'];
    }
    
    public function 
validateSession() {
        
$this->keygen();
        if(
$_SESSION['key'] === $this->key) {
            return 
TRUE;
        } else {
            return 
FALSE;
        }
    }
    
    public function 
endSession() {
        
session_unset();
        
session_destroy();
    }

}


?>
PHP-Code:
<?php namespace Authentificationcore;

class 
userAuthentification {
    private 
$userRepository;
    private 
$sessionController;
    
    public function 
__construct($pdo) {
        
$this->userRepository = new AuthentifikationcoreuserRepository($pdo);
        
$this->sessionController = new AuthentificationcoresessionController;       
    }
    
    public function 
authentUser($user$pass) {
        
$hash hash('SHA512'$pass);
        if(
$this->userRepository->findOneBy($user$hash'1')) {
            
$this->sessionController->initiateSession();
            return 
TRUE;
        } else {
            return 
FALSE;
        }
    }
}

?>
Besonders unzufrieden bin ich mit der Umsetzung von userAuthentification und die Verwendung der Authentifizierung.

Liege ich mit meinem schlechten Gefühl da richtig?
  Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 20.12.2011, 00:07  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.657
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

Was modellierst du denn hier? Wenn du von Authentifizierung und Service-Orientierung sprichst (im Sinne des Transaction-Script-Pattern) solltest du statt Methoden wie find*() eher getUserBy*() oder getUserPermissions() o.ä. modellieren. Vielleicht findest du es dann intuitiver.
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline   Mit Zitat antworten
Alt 20.12.2011, 12:51  
Erfahrener Benutzer
 
Benutzerbild von litterauspirna
 
Registriert seit: 24.04.2008
Beiträge: 3.172
PHP-Kenntnisse:
Anfänger
litterauspirna sorgt für eine eindrucksvolle Atmosphärelitterauspirna sorgt für eine eindrucksvolle Atmosphäre
litterauspirna eine Nachricht über ICQ schicken
Standard

Da ich mich mit Namespaces noch nicht befasst habe frage ich dich einfach mal warum du die Klasse session unter dem Namespace Authenficationcore ablegst?

Eine Session Klasse sollte doch nicht nur für einen Namespace geltend sein?

Oder habe ich da mit dem Namespace was verhauen, im Moment ist die Klasse session doch nur erreichbar wenn der Namespace Authenficationcore bekannt gemacht wurde?

Ansonsten zu der Klasse session, die solltest du noch mal überarbeiten, die macht meiner Meinung nach so keinen Sinn.

Die Authentifizierung würde ich anders gestalten, mich da flexibler machen mittels Adapter wo du in der Lage bist ein Auth über mehrere Speichermedien vornehmen zu können.

Gruß der Litter
__________________
Aus dem Dynamo Lande kommen wir. Trinken immer reichlich kühles Bier. Und dann sind wir alle voll, die Stimmung ist so toll. Aus dem Dynamo Lande kommen wir.
http://www.lit-web.de
litterauspirna ist offline   Mit Zitat antworten
Alt 20.12.2011, 15:53  
archer42
Gast
 
Beiträge: n/a
Standard

Zitat:
Was modellierst du denn hier?
Eine Authentifizierungs "Engine", welche ich, sollte ich irgendwann die MVC Umsetzung verstehen, einsetzen würde.
War das die richtige Antwort?

Zitat:
Wenn du von Authentifizierung und Service-Orientierung sprichst (im Sinne des Transaction-Script-Pattern) solltest du statt Methoden wie find*() eher getUserBy*() oder getUserPermissions() o.ä. modellieren. Vielleicht findest du es dann intuitiver.
Ok, merke ich mir

Zitat:
Da ich mich mit Namespaces noch nicht befasst habe frage ich dich einfach mal warum du die Klasse session unter dem Namespace Authenficationcore ablegst?
Schreibfehler soll Authentification\core heißen. Der Projektname "Authentification" ist nur ein Beispiel

Zitat:
Eine Session Klasse sollte doch nicht nur für einen Namespace geltend sein?
Wie meinst du das?

Zitat:
Ansonsten zu der Klasse session, die solltest du noch mal überarbeiten, die macht meiner Meinung nach so keinen Sinn
Welche Methoden würdest du da einsetzen?

Zitat:
Die Authentifizierung würde ich anders gestalten, mich da flexibler machen mittels Adapter wo du in der Lage bist ein Auth über mehrere Speichermedien vornehmen zu können.
Das klingt gut, kannst du mir einige Stichworte zu einem Adapter Interface in PHP nennen?

Gruß archer42
  Mit Zitat antworten
Alt 22.12.2011, 09:28  
Erfahrener Benutzer
 
Registriert seit: 13.05.2009
Beiträge: 1.168
PHP-Kenntnisse:
Fortgeschritten
dennis81 befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von litterauspirna Beitrag anzeigen
Oder habe ich da mit dem Namespace was verhauen, im Moment ist die Klasse session doch nur erreichbar wenn der Namespace Authenficationcore bekannt gemacht wurde?
Da vertust du dich aber. Namespaces sind im groben nichts anderes als eine logische Strukturierungshilfe von Code. Dadurch lassen sich recht einfach diese ultralangen Namen wie z.B. aus PEAR oder dem ZendFramework (1.x) vermeiden ohne in Namenskonflikte zu geraten.
__________________
Es ist schon alles gesagt! Nur noch nicht von allen! (Karl Valentin)
Wenn du eine weise Antwort verlangst, musst du vernünftig fragen. (Johann Wolfgang von Goethe)
dennis81 ist offline   Mit Zitat antworten
Alt 23.12.2011, 17:42  
Erfahrener Benutzer
 
Benutzerbild von litterauspirna
 
Registriert seit: 24.04.2008
Beiträge: 3.172
PHP-Kenntnisse:
Anfänger
litterauspirna sorgt für eine eindrucksvolle Atmosphärelitterauspirna sorgt für eine eindrucksvolle Atmosphäre
litterauspirna eine Nachricht über ICQ schicken
Standard

Zitat:
Zitat von dennis81 Beitrag anzeigen
Da vertust du dich aber. Namespaces sind im groben nichts anderes als eine logische Strukturierungshilfe von Code. Dadurch lassen sich recht einfach diese ultralangen Namen wie z.B. aus PEAR oder dem ZendFramework (1.x) vermeiden ohne in Namenskonflikte zu geraten.
Danke mal für die Antwort, da habe ich das wirklich falsch verstanden.
__________________
Aus dem Dynamo Lande kommen wir. Trinken immer reichlich kühles Bier. Und dann sind wir alle voll, die Stimmung ist so toll. Aus dem Dynamo Lande kommen wir.
http://www.lit-web.de
litterauspirna ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[Erledigt] PHP Authentifizierung PHP-Fortgeschrittene 11 20.01.2005 00:17

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
projektname strukturverbesserung

Alle Zeitangaben in WEZ +2. Es ist jetzt 01:41 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum