Ver Mensaje Individual
  #20 (permalink)  
Antiguo 03/10/2007, 08:53
Avatar de u_goldman
u_goldman
Moderador
 
Fecha de Ingreso: enero-2002
Mensajes: 8.031
Antigüedad: 22 años, 4 meses
Puntos: 98
Re: Un módulo de usuarios

Ya que tenemos la teoría, pasemos a la práctica, si se fijan en nuestro formulario, comentamos la parte donde el usuario se autentifica:

Código:
	'if ObjUsuario.Autentificar() then
	'	Response.Write("Ahora si ingresaste")
	'else
	'	Set ObjUsuario = Nothing
	'	Session("usuarioID") = ""
	'	Session("loginError") = true
	'	Response.Redirect("login.asp")
	'end if
Como ya vimos, esto se refiere a un método público de la clase usuario llamado Autenficar, que congruente con su aplicación, regresa un boolean si/no el usuario tiene suficientes credenciales, vamos pues a trabajar en nuestro método, abrimos el archivo componentes\usuario.asp y comenzamos a codificar nuestro método Autentificar:

Código:
Public function Autentificar()
        Dim ObjConn
        Dim rs
        Dim cmd
        Dim param
        Dim esUnaAccionExitosa
        Dim qry
        
        esUnaAccionExitosa = false
        
        Set ObjConn = Server.CreateObject("ADODB.Connection")
        Set rs = Server.CreateObject("ADODB.Recordset")
        Set cmd = Server.CreateObject("ADODB.Command")
        
        qry = "SELECT usuario_id FROM tbl_usuario WHERE usuario_uname = ? AND usuario_pwd = ?"
        
        Set param = cmd.CreateParameter("uname", adVarChar, adParamInput, 50, m_uname)
        cmd.Parameters.Append(param)
        Set param = cmd.CreateParameter("pwd", adVarChar, adParamInput, 50, m_pwd)
        cmd.Parameters.Append(param)
        
        ObjConn.Open strConnect
        cmd.ActiveConnection = ObjConn
        cmd.CommandType = adCmdText
        cmd.CommandText = qry
        
        rs.Open cmd
        
        if not rs.EOF then
            m_id = rs("usuario_id")
            esUnaAccionExitosa = true
        else
            m_id = -1
            esUnaAccionExitosa = false
        end if
        
        Set ObjConn = Nothing
        Set rs = Nothing
        Set cmd = Nothing
        Set param = Nothing
        
        Autentificar = esUnaAccionExitosa
end function
Como podrás ver, no tiene ninguna ciencia, simplemente debemos pasarle valores para las propiedades uname y pwd, el método se encarga de hacer una consulta parametrizada a la base de datos, si el usuairo ha sido autentificado, la propiedad id, adquirirá el valor del id del usuario, y el regresará verdadero, si no, regresará falso. Otra cosa mas que destacar es como usamos el string de conexion contenido en conexion.asp que se convierte en una variable super global, los que no estén de acuerdo y estén a punto de gritarme que una clase no debe depender de un valor externo y demás, podrían mover su string de conexión al global.asa por ejemplo, e inicializar su valor en el método Initialize, pero para mi, y espero que para ti también funciona bien de este modo, solo acuérdate de incluir tu archivo de conexion arriba de tus clases.

Bien, nuestro archivo usuario.asp quedaría de la siguiente manera:
Código:
<%
Class usuario
    private m_id
    private m_uname
    private m_pwd
    
    public property get id()
        id = m_id
    end property
    public property let id(p_data)
        m_id = p_data
    end property
    
    public property get uname()
        uname = m_uname
    end property
    public property let uname(p_data)
        m_uname = p_data
    end property
    
    public property get pwd
        pwd = m_pwd
    end property
    public property let pwd(p_data)
        m_pwd = p_data
    end property

    Public function Autentificar()
        Dim ObjConn
        Dim rs
        Dim cmd
        Dim param
        Dim esUnaAccionExitosa
        Dim qry
        
        esUnaAccionExitosa = false
        
        Set ObjConn = Server.CreateObject("ADODB.Connection")
        Set rs = Server.CreateObject("ADODB.Recordset")
        Set cmd = Server.CreateObject("ADODB.Command")
        
        qry = "SELECT usuario_id FROM tbl_usuario WHERE usuario_uname = ? AND usuario_pwd = ?"
        
        Set param = cmd.CreateParameter("uname", adVarChar, adParamInput, 50, m_uname)
        cmd.Parameters.Append(param)
        Set param = cmd.CreateParameter("pwd", adVarChar, adParamInput, 50, m_pwd)
        cmd.Parameters.Append(param)
        
        ObjConn.Open strConnect
        cmd.ActiveConnection = ObjConn
        cmd.CommandType = adCmdText
        cmd.CommandText = qry
        
        rs.Open cmd
        
        if not rs.EOF then
            m_id = rs("usuario_id")
            esUnaAccionExitosa = true
        else
            m_id = -1
            esUnaAccionExitosa = false
        end if
        
        Set ObjConn = Nothing
        Set rs = Nothing
        Set cmd = Nothing
        Set param = Nothing
        
        Autentificar = esUnaAccionExitosa
    End function

End Class
%>
Ahora vamos a quitarle el código comentado al archivo login.asp y detallarlo un poco más:

Código:
<!--#include file = "../conexion.asp"-->
<!--#include file = "../componentes/usuario.asp"-->
<!--#include file = "../admin/header.asp"-->
<%
Dim formaHasidoEnviada
Dim ObjUsuario
Dim strError

formaHasidoEnviada = len(Request.Form("formaEnviada")) > 0
strError = ""

if not formaHasidoEnviada then
	if Session("loginError") then
		strError = "Usuario o contraseña incorrectos, por favor intente de nuevo"
		Session.Contents.Remove("loginError")
	end if
	%>
	<div class="error"><%=strError%></div>
	<form action="login.asp" method="post" id="formaAsp">
		<input type="hidden" name="formaEnviada" value="1" />
		<input type="hidden" name="accion" value="ingresar" />
	    
		<fieldset class="forma">
			<legend>Introduzca sus datos de acceso</legend>
			<div class="formaEtiqueta">
				<label for="uname">Usuario:&nbsp;</label>
			</div>
			<div class="formaCampo">
				<input type="text" id="uname" name="uname" value="" maxlength="50" />
			</div>
			<br />
			<div class="formaEtiqueta">
				<label for="pwd">Password:&nbsp;</label>
			</div>
			<div class="formaCampo">
				<input type="password" id="pwd" name="pwd" maxlength="8" value="" />
			</div>
			<br />
			<input type="submit" value="Ingresar" class="formaBoton" />
		</fieldset>
	</form>
<%
else
	Set ObjUsuario = new usuario
	ObjUsuario.uname = trim(Request.Form("uname"))
	ObjUsuario.pwd = trim(Request.Form("pwd"))
	
	if ObjUsuario.Autentificar() then
            'Guardamos en sesion el id del usuario
                Session("usuarioID") = ObjUsuario.id
		Response.Write("Ahora si ingresaste")
	else
		Set ObjUsuario = Nothing
		Session("usuarioID") = ""
		Session("loginError") = true
		Response.Redirect("login.asp")
	end if
end if
%>
<!--#include file = "../admin/footer.asp"-->
Lo único que agregamos fué lo que se encuentra en negritas, básicamente guardamos el id del usuario en sesión, quizás podríamos guardar el objeto usuario completo, pero a mi me ha dado muy mal resultado persistir objetos en sesión, así que mejor guardamos solamente su id, y crearemos un método ObtenerDatos() que estableciendo el id del usuario, nos devuelva todo lo demás...pero eso lo haremos después

Ahora ya puedes abrir tu base de datos y agregar un usuario

uname = usuario
pwd = 123456 'Nuestro pwd super seguro, tambien nos encargaremos de esto mas adelante


Y probamos la aplicación, espero que te funcione, si no, puedes regresar a gritarme...yo no la he probado aún
__________________
"El hombre que ha empezado a vivir seriamente por dentro, empieza a vivir más sencillamente por fuera."
-- Ernest Hemingway