Apps für Android programmieren leicht gemacht!
Passwortabfrage

Passwortabfrage

Viele Apps nutzen eine Passwortabfrage, um ihre Nutzer zu identifizieren.
Wir möchten uns in diesem Artikel gerne einmal den Grundprinzipien der Passwortabfrage nähern und klarstellen, wie man eben eine solche umsetzen könnte.

Dabei gehen wir allerdings nicht auf eine Passwortabfrage aus dem Internet ein, da uns hier die Mittel fehlen. Wir programmieren die Abfrage eines Passwortes in einer Android App einfach anhand eines lokal erstellten und gespeicherten Passwortes, um zum Beispiel einen geheimen Text freizulegen.

 

Das Aussehen:

Dazu erstellen wir ganz einfach ein neues Projekt oder nutzen ein bereits bestehendes Projekt.
Wir erstellen nun ein neues Layout und nennen es am besten „login_layout.xml“.
Anschließend fügen wir 2 Textfelder hinzu und natürlich einen Button, zum Absenden. Am simpelsten wäre es wir nutzen ein Textfeld des Typs „Person Name“ (android:inputType=“textPersonName“) und eines des Typs „Password“ (android:inputType=“textPassword“).

Das Ganze könnte dann in etwa so aussehen:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">


    <EditText
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:inputType="textPersonName"
        android:text="Name"
        android:ems="10"
        android:id="@+id/name"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true" />

    <EditText
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:inputType="textPassword"
        android:ems="10"
        android:id="@+id/passwort"
        android:layout_below="@+id/name"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="20dp"
        android:hint="Passwort" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Login"
        android:id="@+id/login"
        android:layout_below="@+id/passwort"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="20dp" />
</RelativeLayout>

 

Nun, da wir das Aussehen des Login-Bereichs definiert haben müssen wir selbstverständlich auch die Routine im Hintergrund programmieren.
Unsere Routine soll einen Nutzer, bei richtigem Passwort einloggen und bei falschem Passwort eine Meldung ausgeben.
Das klingt an sich sehr einfach, ist aber vorerst mit etwas Arbeit verbunden, immerhin muss unser Nutzer sein Passwort und seinen Nutzernamen im Vorhinein noch wählen.

Eben dazu benötigen wir ein zweites Layout, welches unser Nutzer bei ersten Öffnen der App angezeigt bekommt.
Auch hier benötigen wir ebenfalls ein Feld, in dem der Nutzer seinen Nutzernamen wählen kann und noch 2 weitere Felder, für das Passwort.
Wir benötigen 2 Felder für die Passworteingabe, damit wir sicherstellen können, dass der Nutzer sich nicht verschrieben hat.

Unser Layout „einrichtung_layout.xml“ könnte dann wie folgt aussehen:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">


    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:text="Wähle ein Passwort und einen Nutzernamen. \nDroid-Lernen.de"
        android:id="@+id/textView" />

    <EditText
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:inputType="textPersonName"
        android:text="Name"
        android:ems="10"
        android:id="@+id/name"
        android:layout_alignParentTop="false"
        android:layout_centerHorizontal="true"
        android:layout_below="@+id/textView"
        android:layout_marginTop="20dp" />

    <EditText
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:inputType="textPassword"
        android:ems="10"
        android:id="@+id/passwort"
        android:layout_below="@+id/name"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="20dp"
        android:hint="Passwort" />

    <EditText
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:inputType="textPassword"
        android:ems="10"
        android:id="@+id/passwort2"
        android:layout_below="@+id/passwort"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="20dp"
        android:hint="Passwort wiederholen" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Speichern"
        android:id="@+id/speichern"
        android:layout_below="@+id/passwort2"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="20dp" />
</RelativeLayout>

 

Der Programmcode:

Schlussendlich benötigen wir nur noch unsere reine Routine, im Java-Code, um unsere Passwortabfrage funktionell zu machen.

In unserem Fall speichern wir die Nutzerdaten in den SharedPreferences.
Dies ist vielleicht nicht der sicherste Weg, doch reicht es für unsere Zwecke.
Ich werde nicht weiter auf die Funktionsweise der SharedPreferences eingehen, dies ist hier bereits ausführlich geschehen: Einstellungen speichern

Wir müssen zum Start der App überprüfen, ob bereits ein Passwort gesetzt wurde.
Falls kein Passwort gesetzt wurde, müssen wir dem Nutzer die Möglichkeit dazu bieten.
Falls jedoch bereits ein Passwort gesetzt wurde, müssen wir dieses Abfragen, bevor wir die eigentliche App anzeigen.
Am besten bietet sich dazu die Funktion „onCreate()“ an, welche direkt beim Start der App aufgerufen wird.

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        //shared data vorbereiten
        pref = getSharedPreferences("Droid-Lernen", MODE_PRIVATE);
        editor = pref.edit();

        //prüfen, ob Passwort gesetzt wurde
        if(pref.getString("Passwort", "").equals("")){

            //Passwort wurde noch nicht gesetzt
            passwortEingabe();

        }else {

            //Passwort wurde bereits gesetzt
            passwortAbfrage();

        }
    }

Dieser Code überprüft zu Beginn der App, ob bereits ein Passwort gesetzt wurde oder nicht.
Ist keines gesetzt wird die Funktion „passwortEingabe()“ aufgerufen, diese behandelt das Speichern der Nutzerdaten.
Ist bereits eines gesetzt wird die Funktion „passwortAbfrage()“ aufgerufen, diese behandelt die Passwortabfrage und das spätere Anzeigen der App selber.

 

passwortEingabe():

Die Funktion „passwortEingabe()“ habe ich wie folgt definiert:

  1. Als Erstes wird das entsprechende Layout angezeigt.
  2. Beim Klick auf den „Speichern“ Knopf durchläuft das Programm diese Schritte:
    1. Herausfinden der Eingabefelder und deren Inhalt.
    2. Prüfen ob Passwort 1 und Passwort 2 übereinstimmen.
    3. Das Speichern von Passwort und Nutzername in den SharedPreferences.
    4. Anzeige der Passwortabfrage.

 

public void passwortEingabe(){

        setContentView(R.layout.einrichtung_layout);

        Button speichernButton = (Button) findViewById(R.id.speichern);
        speichernButton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {

                // Speichere die Nutzerdaten, beim Klick auf "Speichern"
                EditText name = (EditText) findViewById(R.id.name);
                EditText passwort1 = (EditText) findViewById(R.id.passwort);
                EditText passwort2 = (EditText) findViewById(R.id.passwort2);

                // prüfe, ob die beiden Passwörter überein stimmen
                if(passwort1.getText().toString().equals(passwort2.getText().toString())){

                    // Passwort ist gleich. Nutzerdaten werden eingetragen, gespeichert und Passwortabfrage aufgerufen
                    editor.putString("Passwort", passwort1.getText().toString());
                    editor.putString("Name", name.getText().toString());
                    editor.commit();

                    passwortAbfrage();

                }else{

                    // Passwörter waren nicht gleich
                    Toast.makeText(MainActivity.this, "Passwörter stimmen nicht überein.", Toast.LENGTH_LONG).show();

                }

            }
        });

    }

 

passwortAbfrage():

Die Funktion „passwortAbfrage()“ habe ich wie folgt definiert:

  1. Als Erstes wird das entsprechende Layout angezeigt.
  2. Beim Klick auf den „Login“ Knopf durchläuft das Programm diese Schritte:
    1. Prüfen ob der Name in den SharedPreferences gespeichert wurde, andernfalls Nachricht.
    2. Prüfen ob das Passwort in den SharedPreferences gespeichert wurde, andernfalls Nachricht.
    3. Aufruf der Funktion „zeigeApp()“, welche der Start der eigentlichen App bedeutet.

 

public void passwortAbfrage(){

        setContentView(R.layout.login_layout);

        Button loginButton = (Button) findViewById(R.id.login);
        loginButton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                // Logge Nutzer ein, sofern Passwort stimmt.

                EditText passwort = (EditText) findViewById(R.id.passwort);
                EditText name = (EditText) findViewById(R.id.name);

                // prüfen ob Name stimmt
                if(pref.getString("Name", "").equals(name.getText().toString())){

                    // Name stimmt
                    // Prüfe jetzt, ob Passwort stimmt
                    if(pref.getString("Passwort", "").equals(passwort.getText().toString())){

                        // Passwort stimmt ebenfalls, zeige App an
                        zeigeApp();

                    }else {

                        //Passwort stimmt nicht
                        Toast.makeText(MainActivity.this, "Passwort stimmt nicht.", Toast.LENGTH_LONG).show();
                    }

                }else{

                    // Name stimmt nicht
                    Toast.makeText(MainActivity.this, "Name stimmt nicht.", Toast.LENGTH_LONG).show();

                }

            }
        });

    }

 

zeigeApp():

Innerhalb der Funktion „zeigeApp()“ können folglich alle relevanten Dinge erledigt werden, die normalerweise in der Funktion „onCreate()“ gestanden hätten.

public void zeigeApp(){
        // zeige die eigentliche App an.
        // Hier bitte alle Funktionen eintragen, die beim Start ausgeführt werden sollen
        
        setContentView(R.layout.activity_main);
    }

 

Passwortabfrage


Der Source Code passend zu diesem Artikel. Dieser Download enthält alle nötigen Codes.

DownloadLizenzbedingungen

Marvin

Ich bin 23 Jahre jung und studiere zurzeit Wirtschaftsinformatik an der Georg-August-Universität in Göttingen. Ich bin ein Mensch, der sich neben der Programmierung noch für tausend andere Dinge interessiert, die mal mehr und mal weniger verrückt sind. Vor allem aber bin ich Feuer und Flamme mit der Programmierung von eigenen kleinen Apps und Programmen, die mein Leben bereichern.

2 Kommentare

*Pflichtfeld

  • Hallo, ich bin 14 Jahre alt und habe vor knapp 6 Monaten mit dem Programmieren von eigenen Android-Apps begonnen. Dein Code scheint mir bis jetzt sehr klar vorzukommen, nur eine Sache verstehe ich nicht.

    pref = getSharedPreferences(„Droid-Lernen“, MODE_PRIVATE);
    editor = pref.edit();

    Was genau passiert hier und wofür ist es gut?
    Danke im Vorraus.
    LG Chris

    • Hallo Christoph,

      Diese zwei Zeilen ermöglichen es uns kleinere Einstellungen oder anders gesagt kurze Zeichen-/Zahlenketten innerhalb der Android App speichern zu können, ohne uns mit dem Speichern von Dateien rumschlagen zu müssen.

      Hast du schon einmal mit Datenbanken gearbeitet?
      Stell es dir einfach, wie eine Excel-Datei vor.
      Wir erstellen oder öffnen (je nachdem ob die Tabelle schon existiert) über die beiden Zeilen eine neue Tabelle in einer Excel-Datei. Diese lautet „Droid-Lernen“ und ist für unsere App privat (nur unsere App darf diese Tabelle öffnen).
      Nun können wir über weitere Befehle auf der Variable „pref“ neue Tabellenzeilen erstellen, auslesen oder bearbeiten/speichern. Mit „editor.commit()“ würden wir dann die Zeile speichern.

      Mehr Infos gibt es hier: https://droid-lernen.de/einstellungen-speichern/

      Um es für diesen Artikel klar zu machen: Wir erstellen eine Zeile in den Einstellungen, in der wir das Passwort speichern, um beim zweiten öffnen damit vergleichen zu können.

      Gruß,
      Marvin