Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

Duda de novato en YiiFramework

Estas en el tema de Duda de novato en YiiFramework en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Hola gente, estoy estudiando este Framework que parece potente, pero me he quedado un pelin estancado en un tema , "el login de usuario". El ...
  #1 (permalink)  
Antiguo 25/02/2013, 12:59
Avatar de Dundee  
Fecha de Ingreso: junio-2002
Ubicación: El Médano
Mensajes: 1.310
Antigüedad: 21 años, 10 meses
Puntos: 8
Duda de novato en YiiFramework

Hola gente, estoy estudiando este Framework que parece potente, pero me he quedado un pelin estancado en un tema , "el login de usuario". El tema es que leo el código y lo entiendo bastante bien, pero en concreto no comprendo del todo el código de modelo LoginForm.php que es el que se encarga del login de los usuarios.

Pego el código para que se entienda mejor.
Código:
class LoginForm extends CFormModel
{
	public $username;
	public $password;
	public $rememberMe;

	private $_identity;

	/**
	 * Declares the validation rules.
	 * The rules state that username and password are required,
	 * and password needs to be authenticated.
	 */
	public function rules()
	{
		return array(
			// username and password are required
			array('username, password', 'required'),
			// rememberMe needs to be a boolean
			array('rememberMe', 'boolean'),
			// password needs to be authenticated
			array('password', 'authenticate'),
		);
	}

	/**
	 * Declares attribute labels.
	 */
	public function attributeLabels()
	{
		return array(
			'rememberMe'=>'Remember me next time',
		);
	}

	/**
	 * Authenticates the password.
	 * This is the 'authenticate' validator as declared in rules().
	 */
	public function authenticate($attribute,$params)
	{
		if(!$this->hasErrors())
		{
			$this->_identity=new UserIdentity($this->username,$this->password);
			if(!$this->_identity->authenticate())
				$this->addError('password','Incorrect username or password.');
		}
	}

	/**
	 * Logs in the user using the given username and password in the model.
	 * @return boolean whether login is successful
	 */
	public function login()
	{
		if($this->_identity===null)
		{
			$this->_identity=new UserIdentity($this->username,$this->password);
			$this->_identity->authenticate();
		}
		if($this->_identity->errorCode===UserIdentity::ERROR_NONE)
		{
			$duration=$this->rememberMe ? 3600*24*30 : 0; // 30 days
			Yii::app()->user->login($this->_identity,$duration);
			return true;
		}
		else
			return false;
	}
}
No entiendo muy bien en rules() esta regla array('password', 'authenticate'), porque el modelo tiene otro método login() que realiza la misma comprobación de que el usuario es válido y crea una instancia new UserIdentity. ¿Además por qué se le pasan a authenticate dos parmámetros $attribute y $params que nunca se usan?.

Gracias de antemano.
__________________
Videotutoriales de Drupal
  #2 (permalink)  
Antiguo 25/02/2013, 13:39
Avatar de carlos_belisario
Colaborador
 
Fecha de Ingreso: abril-2010
Ubicación: Venezuela Maracay Aragua
Mensajes: 3.156
Antigüedad: 14 años
Puntos: 461
Respuesta: Duda de novato en YiiFramework

Buenas ese es un simple ejemplo de login que te trae el framework, el porque lo hicieron así, tal vez por hacerlo simple, pero en si para el manejo de usuario te recomiendo Cruge, tiene admin de user, manejo de RBAC lo veo muy completo, verificalo y nos cuentas como te va, saludos
__________________
aprende d tus errores e incrementa tu conocimientos
it's not a bug, it's an undocumented feature By @David
php the right way
  #3 (permalink)  
Antiguo 26/02/2013, 05:08
Avatar de Dundee  
Fecha de Ingreso: junio-2002
Ubicación: El Médano
Mensajes: 1.310
Antigüedad: 21 años, 10 meses
Puntos: 8
Respuesta: Duda de novato en YiiFramework

Cita:
Iniciado por carlos_belisario Ver Mensaje
Buenas ese es un simple ejemplo de login que te trae el framework, el porque lo hicieron así, tal vez por hacerlo simple, pero en si para el manejo de usuario te recomiendo Cruge, tiene admin de user, manejo de RBAC lo veo muy completo, verificalo y nos cuentas como te va, saludos
Hola, ante todo gracias por tu respuesta, pero lo que necesito es entender el código; soy consciente de que existirán mejores maneras de autenticar a los usuarios, pero primeramente necesito comprender los ejemplos del libro que me estoy leyendo a modo de aprendizaje. Empezar las casas por los tejados nunca ha sido buena idea, por ello primero es necesario que comprenda este sistema de login y luego ya implementaré otros mejores.

Un saludo
__________________
Videotutoriales de Drupal
  #4 (permalink)  
Antiguo 26/02/2013, 15:08
Avatar de carlos_belisario
Colaborador
 
Fecha de Ingreso: abril-2010
Ubicación: Venezuela Maracay Aragua
Mensajes: 3.156
Antigüedad: 14 años
Puntos: 461
Respuesta: Duda de novato en YiiFramework

ya viste lo que hay en protected/components/UserIdentity.php?? ahí esta el método de autenticate, es ahí donde esta el método para hacer la autenticación, el model los parámetros $attribute, $params son por convención para crear los validators http://www.yiiframework.com/wiki/168...lidation-rule/ mas información.
__________________
aprende d tus errores e incrementa tu conocimientos
it's not a bug, it's an undocumented feature By @David
php the right way
  #5 (permalink)  
Antiguo 27/02/2013, 03:40
Avatar de Dundee  
Fecha de Ingreso: junio-2002
Ubicación: El Médano
Mensajes: 1.310
Antigüedad: 21 años, 10 meses
Puntos: 8
Respuesta: Duda de novato en YiiFramework

Cita:
Iniciado por carlos_belisario Ver Mensaje
ya viste lo que hay en protected/components/UserIdentity.php?? ahí esta el método de autenticate, es ahí donde esta el método para hacer la autenticación, el model los parámetros $attribute, $params son por convención para crear los validators http://www.yiiframework.com/wiki/168...lidation-rule/ mas información.
Hola de nuevo, mira eso todo lo entiendo , llevo unos días leyendo sobre los componentes, controladores y modelos en YiiFw , y entiendo bastante bien como funcionan; pero lo que no comprendo es lo que pregunto en mi primer post (pegarlo todo de nuevo creo que sería demasiado pesado para el resto de personas que sigan este hilo). Voy a seguir con mis "inevstigaciones" y si llego a alguna conclusión prometo lo contaré por aquí.

Después de estar un ratillo nadando en el código, he llegado a la siguiente conclusión:

El login del usuario lo "carga" el controlador SiteController con el action "login" que ha su vez crea una instancia del modelo LoginForm ($model=new LoginForm;).

MI DUDA: Según veo en el módelo LoginForm se lleva a cabo una serie de tareas (métodos del modelo):

1.
Código:
    public function rules()
	{
		return array(
			// username and password are required
			array('username, password', 'required'),
			// rememberMe needs to be a boolean
			array('rememberMe', 'boolean'),
			// password needs to be authenticated
			array('password', 'authenticate'), //Esto llama al método authenticate del modelo
		);
	}
Y 2.
Código:
public function login()
	{
		if($this->_identity===null)
		{
			$this->_identity=new UserIdentity($this->username,$this->password);
			$this->_identity->authenticate();
		}
		if($this->_identity->errorCode===UserIdentity::ERROR_NONE)
		{
			$duration=$this->rememberMe ? 3600*24*30 : 0; // 30 days
			Yii::app()->user->login($this->_identity,$duration);
			return true;
		}
		else
			return false;
	}
Si nos fijamos, ambos hacen uso de authenticate() cosa que no entiendo , primero porque en rules ya se realiza dicha autentificación, y además dicho método authenticate tiene dos parámetro que nunca se le pasan:
Código:
public function authenticate($attribute,$params)
	{
		if(!$this->hasErrors())
		{
			$this->_identity=new UserIdentity($this->username,$this->password);
			if(!$this->_identity->authenticate())
				$this->addError('password','Incorrect username or password.');
		}
	}
¿De donde salen los parámetros $attribute,$params del método authenticate ?
¿Alguna idea de que se me esta escapando para comprender esto?.

Mil gracias de antemano
__________________
Videotutoriales de Drupal

Última edición por Dundee; 27/02/2013 a las 04:30 Razón: Añadir información
  #6 (permalink)  
Antiguo 27/02/2013, 04:42
Avatar de Dundee  
Fecha de Ingreso: junio-2002
Ubicación: El Médano
Mensajes: 1.310
Antigüedad: 21 años, 10 meses
Puntos: 8
Respuesta: Duda de novato en YiiFramework

Me respondo a mi mismo. Acabo de caer en la cuenta de que el método login del modelo loginForm llama a dos métodos distintos con el mismo nombre:

1.
En rules(): en este caso hace referencia al método authenticate de la misma clase
Código:
array('password', 'authenticate'),
2.
En login(): en este caso hace referencia al método authenticate de la clase UserIdentity
Código:
$this->_identity=new UserIdentity($this->username,$this->password);
			$this->_identity->authenticate();
Y parece ser que en este método se altera el número de parámetros que se le pasan, es decir se hace un overriding del mismo.
Ahora me surgen más dudas, ya que el método authenticate de la clase UserIdentity consulta la contraseña de Gii que no se que tiene que ver con todo esto (ya que Gii lo he utilizado para crear el crude la aplicación , pero no se que pinta su contraseña en esto), la verdad que estoy un poco hecho un lio.

Metódo authenticate() de UserIdentity
Código:
class UserIdentity extends CUserIdentity
{
	/**
	 * Authenticates a user.
	 * @return boolean whether authentication succeeds.
	 */
	public function authenticate()
	{
		$password=Yii::app()->getModule('gii')->password;
		if($password===null)
			throw new CException('Please configure the "password" property of the "gii" module.');
		else if($password===false || $password===$this->password)
			$this->errorCode=self::ERROR_NONE;
        else
            $this->errorCode=self::ERROR_UNKNOWN_IDENTITY;
		return !$this->errorCode;
	}
}
__________________
Videotutoriales de Drupal
  #7 (permalink)  
Antiguo 27/02/2013, 14:25
Avatar de carlos_belisario
Colaborador
 
Fecha de Ingreso: abril-2010
Ubicación: Venezuela Maracay Aragua
Mensajes: 3.156
Antigüedad: 14 años
Puntos: 461
Respuesta: Duda de novato en YiiFramework

Pues te lo vuelvo a repetir, es solo un ejemplo y que no es funcional ya que no usan ningun tipo de DB, dicho por ellos mismos
Código PHP:
Ver original
  1. /**
  2.      * Authenticates a user.
  3.      * The example implementation makes sure if the username and password
  4.      * are both 'demo'.
  5.      * In practical applications, this should be changed to authenticate
  6.      * against some persistent user identity storage (e.g. database).
  7.      * @return boolean whether authentication succeeds.
  8.      */

ahora
Cita:
En rules(): en este caso hace referencia al método authenticate de la misma clase
Código:
array('password', 'authenticate'),
el metodo rules son las reglas de validación que se ejecutan al procesar el modelo. Entonces authenticate es simplemente eso una regla de validación que declararon dentro del mismo modelo, porque tiene dos parametros que no usa en la declaración?? por convención de declaración de reglas de validación y de ahí el link que te deje que lo explica mucho mejor que yo.

Cita:
En login(): en este caso hace referencia al método authenticate de la clase UserIdentity

Código PHP:
Ver original
  1. $this->_identity=new UserIdentity($this->username,$this->password);
  2.             $this->_identity->authenticate();
Y parece ser que en este método se altera el número de parámetros que se le pasan, es decir se hace un overriding del mismo.
Ahora me surgen más dudas, ya que el método authenticate de la clase UserIdentity consulta la contraseña de Gii que no se que tiene que ver con todo esto (ya que Gii lo he utilizado para crear el crude la aplicación , pero no se que pinta su contraseña en esto), la verdad que estoy un poco hecho un lio.
En ningun momento hay sobreescritura de metodo ya que el metodo authenticate de la clase UserIdentity es llamado tal cual como esta declarado y no recibe ningún parámetro, lo que recibe los parámetros user y password es el constructor de la clase UserIdentity o mejor dicho el constructor de su padre CUserIdentity, que es el que se ejecuta al hacer la instancia ya que no hubo sobreescritura en la declaración de la clase UserIdentity.

Ahora mi consejo es que te concentres realmente en lo importante que es en el desarrollo de una app con Yii ya que te estas liando con un ejemplo que no es funcional en ningún caso, si deseas ver bien sobre login hay ejemplos mas completos en la misma wiki de Yii que involucran a la base de datos, RBAC y otras cosas más útiles. Además que hay muchos modulos o componentes para manejar usuarios bien completos como Cruge, YUM, yiiRight, etc., pero es solo un consejo, porque de verdad en mi opinión te estas volviendo un lío con algo infuncional, ya te va a tocar volverte lío con cosas que si son funcionales e importantes, saludos
__________________
aprende d tus errores e incrementa tu conocimientos
it's not a bug, it's an undocumented feature By @David
php the right way

Etiquetas: login
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:18.