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: </label>
</div>
<div class="formaCampo">
<input type="text" id="uname" name="uname" value="" maxlength="50" />
</div>
<br />
<div class="formaEtiqueta">
<label for="pwd">Password: </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