Java - Login de usuarios

 
Vista:
sin imagen de perfil
Val: 22
Ha aumentado 1 puesto en Java (en relación al último mes)
Gráfica de Java

Login de usuarios

Publicado por José Maria (13 intervenciones) el 22/08/2016 23:32:10
Buenas amigos,
Tengo el siguiente codigo para hacer login, tengo una clase conexion que me funciona, pero no entiendo porque me falla el codigo.
Os lo dejo por si alguien puede ayudarme.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
	//Creo el objeto "con" para poder hacer uso de todos los métodos que hay en el
	Conexion con;
	//Llamamos a la conexión
	con = new Conexion();
	//Connection conexion = con.getConnection();
 
 
	if(txtUsuario.getText().length()>0 && txtPass.getText().length()>0){
		try{
			//Connection con = Db.connect();
			Connection conexion = con.getConnection();
			Statement s =  conexion.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
			//ResultSet r = s.executeQuery("select * from T_Empleados where Nombre_E=\""+txtUsuario.getText()+"\" and contrasena=\""+txtPass.getText()+"\" ");
			/*Nuevo*/ ResultSet r = s.executeQuery("SELECT * FROM T_Empleados WHERE Nombre_E='"+txtUsuario+"' AND contrasena ='"+txtPass+"'");
			/*Nuevo*/ r.last();
			int encontrado=r.getRow();
			if(encontrado==1)
			{
				//this.setVisible(true);
				JOptionPane.showMessageDialog(null, "vamooooooooooooooooS!!");
			}
			else
			{
				JOptionPane.showMessageDialog(null, "Sus datos son incorrectos, reviselos");
			}
 
			r.close();
			s.close();
			/**----------------------------------------------*/
 
		} catch(SQLException e){
			System.out.println(e.getMessage());
		}
	}else{
		JOptionPane.showMessageDialog(rootPane, "No debes dejar campos vacios !!");        
	}
}

Un saludo
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 111
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Login de usuarios

Publicado por gonzalo (112 intervenciones) el 31/08/2016 19:00:44
Buenas tardes don Jose

mi recomendacion es que primero busques al usuario, si resulto almenos 1 usuario entonces recuperar el registro y comparas el password para asi evaluar si el login es correcto, de esa forma evitas en cierto modo el sql inyection.

me explico: mira la orden como la escribiste

"select * from T_Empleados where Nombre_E=\""+txtUsuario.getText()+"\" and contrasena=\""+txtPass.getText()+"\" "

siguiendo tu logica: si se encuentra almenos 1 registro entonces el usuario y el password es correcto, hasta aqui la logica esta bien, pero imaginemos por un momento que en el usuario escribe en el txtUsuario

' or (1=1) --

la orden sql quedaria asi:

"select * from T_Empleados where Nombre_E='' or (1=1) -- and contrasena="LoQueSeaLaVerdadNoImporta"

los 2 giones despues de (1=1) cancelarian el resto del query y te regresaria todos los registros de la base de datos y segun la logica de tu codigo pasaria como un usuario valido.

mejor pide primero el usuario:

"select * from T_Empleados where Nombre_E='"+txtUsuario.getText()+"';

con eso va a regresar almenos 1 renglon sin importar si el password es correcto.

ahora recuperas el primer renglon, si el password coincide entonces el usuario es valido.

si no coincide el password o si no regreso almenos 1 renglon entonces cancelas el acceso.

y si el login fallo entonces guarda en un LOG el login y password con el que intentaron acceder.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 22
Ha aumentado 1 puesto en Java (en relación al último mes)
Gráfica de Java

Login de usuarios

Publicado por José Maria (13 intervenciones) el 01/09/2016 12:34:05
Muchas gracias por tu tiempo,te he entendido muy bien.
Seguro que funciona!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 111
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Login de usuarios

Publicado por gonzalo (112 intervenciones) el 01/09/2016 17:26:39
ahora bien, en donde esta el problema?

cual linea de codigo es la que no funciona?

puedes tambien anexar el error que reporta?

una buena idea es crear una clase que maneje las bases de datos asi no reescribes la secuencia para abrir la conexion, pasarle el query etc, define mejor una clase que controle el acceso, asi solo creas una referencia a la clase y la clase se encargara de hacer el resto.

este es un ejemplo de una clase que maneja 3 servidores distintos, 1 es sql express y 2 son MsSql, te sera facil crear una clase para un server Mdb, o tal vez Oracle.

(continuo al final de la clase)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
 
public class MsSql
{
	private String BaseDeDatos;
 
	private String DbUser;
	private String Passwod;
 
	Connection connection=null;
	Statement statement=null;
	ResultSet Rs;
 
	private String getConnection="";
 
	public MsSql(String Bd)
	{
		BaseDeDatos=Bd;
		switch(Bd.trim().toUpperCase())
		{
			case "SERVER01":
				getConnection="jdbc:sqlserver://Server-0101;\\SQLEXPRESS;databaseName=Montreal"; //:1433
				DbUser="UserServer01";
				Passwod="PasswordServer01";
				break;
 
			case "SERVER02":
				getConnection="jdbc:sqlserver://Server-0201;database=Kalaimary"; //:1433
				DbUser="UserServer02";
				Passwod="PasswordServer02";
				break;
 
			case "SERVER03":
				getConnection="jdbc:sqlserver://Server-0301;database=Estocolmo"; //:1433
				DbUser="UserServer03";
				Passwod="PasswordServer03";
				break;
 
			default:
				LogFile.Write("MsSql.MsSql.switch:"+Bd.toUpperCase()+" is not set.");
				break;
		}
 
		try
		{
			connection = DriverManager.getConnection(getConnection, DbUser,Passwod);
			statement = connection.createStatement(); //ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE );// ResultSet.CONCUR_READ_ONLY);
		} catch (SQLException e)
		{
			LogFile.Write("MsSql.MsSql:"+e.getMessage());
		}
	}
 
	public boolean Select(String SqlCommand,boolean Modo)
	{
		boolean Ok=false;
 
		if(!Modo)
		{
			System.out.println();
			System.out.println(SqlCommand);
			System.out.println();
			System.exit(0);
		}else
		{
			try
			{
				Rs = statement.executeQuery(SqlCommand);
				Ok=true;
			} catch (SQLException e)
			{
				LogFile.Write("MsSql.Query: "+e.getMessage()+"\n"+SqlCommand+"\n\n");
			}
		}
		return Ok;
	}
 
	public boolean Next()
	{
		boolean Ok=false;
		try
		{
			Ok=Rs.next();
		} catch (SQLException e)
		{
			LogFile.Write("MsSql.Next: "+e.getMessage()+"\n");
		}
		return Ok;
	}
 
	public boolean Update(String SqlCommand,boolean Modo)
	{
		boolean Ok=false;
 
		if(!Modo)
		{
			System.out.println(SqlCommand);
			System.exit(0);
		}else
		{
			try
			{
				statement.executeUpdate(SqlCommand);
				Ok=true;
			} catch (Exception e)
			{
				LogFile.Write("MsSql.Execute:"+e.getMessage()+"\n"+SqlCommand+"\n\n");
			}
		}
		return Ok;
	}
 
	protected void Close()
	{
		try
		{
			//Rs.close();
			statement.close();
			connection.close();
		} catch (SQLException e)
		{
			LogFile.Write("MsSql.Close:"+BaseDeDatos);
		}
	}
 
	public String GetString(String Campo)
	{
		String Ok="";
 
		try
		{
			Ok=Rs.getString(Campo);
			if(Ok==null)
			{
				Ok="";
			}
		} catch (SQLException e)
		{
			LogFile.Write("MsSql.GetString:"+e.getMessage());
		}
 
		return Ok;
	}
 
	public double GetDouble(String Campo)
	{
		double Ok=0;
 
		try
		{
			Ok=Rs.getDouble(Campo);
		} catch (SQLException e)
		{
			LogFile.Write("MsSql.GetString:"+e.getMessage());
		}
 
		return Ok;
	}
 
	public int GetInt(String Campo)
	{
		int Ok=0;
 
		try
		{
			Ok=Rs.getInt(Campo);
		} catch (SQLException e)
		{
			LogFile.Write("MsSql.GetString:"+e.getMessage());
		}
 
		return Ok;
	}
 
	public Date GetDate(String Campo)
	{
		Date Ok = null;
 
		try
		{
			Ok=Rs.getDate(Campo);
		} catch (SQLException e)
		{
			LogFile.Write("MsSql.GetString:"+e.getMessage());
		}
 
		return Ok;
	}
 
//puedes agregar un Get para cada tipo de datos si es que asi lo necesitas
 
}

bien entonces creas la clase Test, la funcion Reporte y la referencia a MsSql

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public Class Test
{
public static void Reporte()
{
MsSql MiReporte = new MsSql("Server01"); //Montreal, o el servidor que necesites siempre y cuando este definido en la clase
String Sq.command=
"select * from usuarios order by Nombre";
 
MiReporte.Select(SqlCommand,true); // true=ejecutar el query, false=mostrar el query y detener el programa
 
while(MiReporte.Next())
{
System.out.println(MiReporte.GetString("Nombre")); //imprimir la lista de nombres de los usuarios
}
}
}

y listo, te olvidas de estar haciendo lo mismo cada vez que necesitas un acceso a la base de datos, la clase MsSql lo hace por ti lo unico que haces es referenciar la clase, una de las ventaja de que si corrijes un error en MsSql este se corrige para todo el programa.

espero te sirva.

otra coasa, necesitas el Jar que maneja el servidor de bases de datos, si no haces la referencia entonces no va a funcionar la clase.

salu2 y mucha suerte.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar