2012-06-27 31 views
5

Comencé a mejorar mis habilidades de OOP, resolviendo algunos problemas bastante más fáciles, al construir un sitio web. Empecé con un sistema de inicio de sesión, seguí un tutorial en youtube, me ayudó a crear una clase de inicio de sesión, pero a medida que avanzaba, surgieron muchas dudas (por cierto, el código es de 100 líneas, así que pasaré pegándolo).)Diseño de clase de sistema de inicio de sesión orientado a objetos en php

Entonces en esta clase de inicio de sesión, hay métodos de verificación, etc. pero llega a un punto donde hay verificación de sesión, que con dado antes de parameteres en constructo, no puede usarse (al menos en este alcance de clase):

$this->_username = ($this->_login)? $this->filter($_POST['username']) : $_SESSION['username']; 
    $this->_password = ($this->_login)? $this->filter($_POST['password']) : ''; 
    $this->_passmd5 = ($this->_login)? md5($this->_password) : $_SESSION['password']; 

Así que en ese caso no puedo usar el método verifySession(), cuando no hay variables de sesión definido (a diferencia de lo iniciado sesión el usuario debe ver en la página principal, por ejemplo).

Así que mi pregunta es - ¿ese diseño es correcto, y cómo debo construir el resto del sistema de inicio de sesión: verificación loggedIn en cada página y cierre de sesión - cada uno de ellos debe estar en clase separada (y qué pasa con los métodos, que repetir en clase particular, si siempre los he heredado). Me doy cuenta de que hay diferentes enfoques para OOP, pero ¿hay algo en particular que deba seguir como principiante? (Eso me ayudará a entenderlo todo lo mejor posible).

+0

No entiendo muy bien lo que preguntas aquí (¿puedes aclarar eso?), Pero en general: por lo general, es una buena idea seguir el concepto original y el modelo (el mundo real) con tus clases. Un "inicio de sesión" no es una cosa, pero sí una sesión y un usuario. – Niko

+0

Estoy buscando un "patrón" para construir un sistema de inicio de sesión orientado a objetos (iniciar sesión, cerrar sesión, fastidiarme si el usuario está conectado en cada página), y no estoy seguro de si todas estas cosas deberían estar dentro clase única – Malyo

Respuesta

3

"he seguido un tutorial en youtube" es el primer problema. Solo las tres líneas de código que pegaste revelan que el video que miraste fue creado por un desarrollador aficionado de PHP.

"Así que mi pregunta es - es que el diseño correcto, y cómo debo construir resto del sistema de inicio de sesión"

ya que sólo tres líneas fueron publicadas, no sé si el diseño es correcto o no Apostaría que eso no es así.

Una buena regla de oro para cuando usar un objeto es cuando el código es lo suficientemente avanzado como para requerir más de dos funciones, será utilizado en múltiples ubicaciones en la aplicación, y habrá un gran potencial para nombrar conflictos si el código no está encapsulado en un objeto o espacio de nombres. Esto no cumple con ese criterio: una pantalla de inicio de sesión y registro son de una página cada uno (como máximo) y, por lo tanto, ese código se usará una vez. No hay razón para encapsular esa lógica. Niko mencionó las clases de sesión y usuario, que son patrones comunes y están bien para encapsular.

En cuanto a la construcción de un sistema de inicio de sesión, se vuelven complicados rápidamente y son casi una especialidad en estos días.Recomiendo leer el siguiente artículo SO wiki:

The definitive guide to form-based website authentication

Si desea un sistema preenvasado que sigue el artículo de wiki más arriba, se puede ver en:

http://barebonescms.com/documentation/sso/

El cliente SSO doesn' t presente las clases a la aplicación, solo un conjunto de funciones como SSO_LoggedIn(), SSO_Login(), SSO_Logout(), etc. Hacer OOP solo por hacer OOP cuando algo más simple será suficiente es la forma incorrecta de escribir software. A veces las funciones son mejores. A veces, al subrayar, el código es mejor. Realmente depende y se necesitan años de experiencia para tener la idea de cuál será el mejor enfoque.

+0

gracias que es realmente útil, y lo siento porque la pregunta no es lo suficientemente precisa, requeriría un montón de código para que sea lo suficientemente preciso. – Malyo

4

No estoy seguro de que realmente desee una clase de "inicio de sesión". Es posible hacer somehting como esto

class User 
{ 
    private $username; 
    private $password; 

    public function __construct($username) 
    { 
    //load this user object here 
    } 

    private function hashPassword($password) 
    { 
     ///Dont do this has the hash, but im just keeping it simple 
     return md5($password . 'a}{[email protected]#' . $this->username); 

    } 

    public function authenticate ($password) 
    { 
     return $this->hashPassword($password) == $this->password; 
    } 

} 

login.php

$user = new User($_POST['username']); 
if($user->authenticate($_POST['password'])) 
{ 
//do session initilization here (can be a class, or whatever) 
Session::createUserSession($user) 
} 
else 
echo 'bad login'; 

logout.php

Session::destroyUserSession(); 

Este diseño no es probablemente la mejor manera, pero puede dar una idea.

+0

Es por eso que estoy luchando, hay muchas maneras de resolver esto, pero no puedo decidir qué camino tomar. – Malyo

0

$_SESSION['password']

Nunca debería ser necesario almacenar una contraseña (texto plano?) En una sesión. Debería verificar si un usuario puede iniciar sesión y, si lo hace, le da la contraseña correcta, no almacena más en la sesión que "está conectado". Para su comodidad, también puede almacenar un nombre de usuario de identificación de usuario.

Pero no es necesaria una contraseña después de compararla con la de la base de datos.

Cuestiones relacionadas