Mit SQlite zu überprüfen Anmeldungen in Android
Ich versuche zum erstellen einer Log-in-screen für eine app in Android. Ich habe gespeichert, die Informationen über Benutzer in einem 'Benutzer' - Tabelle in eine Datenbank.
Ich bin versucht, den Benutzernamen und das Passwort eingegeben auf der log-in-Bildschirm, mit der Werte in der Datenbank unter Verwendung der cursor-Objekt, aber es funktioniert nicht , verursacht die app zum Absturz.
Kann mir bitte jemand empfehlen, oder überarbeiten Sie die Vorgehensweise, wenn möglich mit code-snippets.
Werden es zu schätzen große Zeit, danke.
Unten ist der code für die LoginForm-Klasse. (es verwendet einen DBAdapter Klasse eine Verbindung zur Datenbank herstellen)
Paket com.androidbook.LoginForm;
import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.view.View;
import android.widget.AutoCompleteTextView;
import android.widget.Button;
import android.widget.Toast;
public class LoginForm extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final DBAdapter db = new DBAdapter(getBaseContext());
final AutoCompleteTextView username = (AutoCompleteTextView)this.findViewById(R.id.AutoComUsernameLogin);
final AutoCompleteTextView password = (AutoCompleteTextView)this.findViewById(R.id.AutoComPasswordLogin);
Button Register = (Button) findViewById(R.id.ClicktoRegister);
Register.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
Intent myIntent = new Intent(view.getContext(), RegistrationForm.class);
startActivityForResult(myIntent, 0);
}
});
//************************** LOG IN LOGIC******************************//
Button Login = (Button) findViewById(R.id.LoginButton);
Login.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
final String Username = username.getText().toString();
final String Password= password.getText().toString();
db.open();
Cursor c = db.getAllTitles();
while(c.moveToNext())
{
String c1=c.getString(2);
String c2=c.getString(3);
if(c1 == Username)
{
if(c2 == Password)
{
Toast.makeText(LoginForm.this,
"You are succesfully logged in.",
Toast.LENGTH_LONG).show();
Intent myIntent = new Intent(view.getContext(), Menu.class);
startActivityForResult(myIntent, 0);
}
else
{
Toast.makeText(LoginForm.this, "Incorrect password",Toast.LENGTH_LONG).show();
}
Intent myIntent = new Intent(view.getContext(), LoginForm.class);
startActivityForResult(myIntent, 0);
}
else
Toast.makeText(LoginForm.this, "Incorrect",Toast.LENGTH_LONG).show();
}
db.close();
}
});
}
}
- Sie sich mit der Bearbeitung der Benutzer/pass vor dem einfügen in die sql-Anweisung. Es ist wie java prepared statement um zu verhindern, dass sql-injection-Angriff.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Antwort von Chirag Raval oben genannten Funktionen, ist aber anfällig für SQL-injection. Ein böswilliger Benutzer könnte leicht umgehen die Authentifizierung-Mechanismus mit einer basic-SQLi Nutzlast (solange es zumindest einen einzigen Eintrag in die Datenbank wird überprüft).
Eine parametrisierte Abfrage mit begrenzten Werten ist der sicherere Ansatz.
Befestigung der code-snippet:
Diese einfache Verbesserung ist sicherer und einfacher zu Programmieren.
Können Sie eine Funktion in der Datenbank-Klasse, die zurückkehren wird der int-Zahl . wenn die ganze Zahl 1 ist, dann können wir sagen, dass der Benutzername und das Kennwort übereinstimmen, andere weisen, die wir sagen können, login fehlgeschlagen . Es gibt keine Notwendigkeit zu schreiben, komplexen code.
Wenn wir versuchen, diesen code gefragt wird, ändern Sie den Typ boolean...