Einfaches J2EE Loginsystem mit Datenbank

bennot

Mitglied
Hallo Ihr Experten :)

Ich habe eine Hausaufgabe auf. Ich soll in netbeans ein Loginsystem progammieren.

Dabei soll zuerst eine Person mit Name + PW in eine Datenbank abgespeichert werden.

Danach kann man sich mit den Personendaten einloggen und wird auf eine sonst nicht erreichbare Seite weitergeleitet.


Um mich mit allen Vertraut zu machen habe ich folgendes realisiert:

- Login Formular, dass aus einem bereitgestellten String einen username + password entgegennimmt
- vertieft habe ich das ganze in dem ich ein Regestrationformular erstellt habe - über das dann ein username + password in Strings gespeichert wird - die man dann auch zum Login benutzen kann. Funktioniert alles Super.


Die Aufgabe mit der Datenbank ist nun dran, aber mir fehlt das Wissen.

- ich habe eine Datenbank (derby) mit 1 Tabelle username + password erstellt.

1) wie greife ich nun über die Beans auf die Datenbank zu?
2) wie speichere ich die Strings username + password in die Datenbank?
3) wie vergleiche ich ob die Daten mit denen im Login eingebenden nun mit denen in der Datenbank übereinstimmen?


Habe schon nach Tutorials gesucht. Die meisten sind sehr komplex und zudem auf Englisch - so das ich damit nicht weiter komme.

Hat hier Jemand eine gute Seite (am besten auf Deutsch) und/oder kann mir ein Beispiel nennen wo ich sehe wie so was funktioniert?

Vielen Dank :D
 
Danke Thomas für den Link. Oh man ne menge Input. Ich versuche das morgen mal durch zugehen..

Edit: Framework ist übrigens JSF
 
Zuletzt bearbeitet:
Code der Bean:
Info: es existiert noch ein LoginPhaseListener.. dieser wird bei Zugang ist korrekt aktiviert


Code:
@ManagedBean(name = "login")
@RequestScoped
public class LoginBean {

    
    // für regestration
      private String username;
    private String password;
     private String dbusername;

    private String dbpassword;
    // für datenbank zugriff
    
    Connection con;
    Statement ps;
    ResultSet rs;
    String SQL_Str;
    

    
    
      public void dbData(String UName)
    {
        try
        {
          
               Class.forName("com.derby.jdbc.Driver");
             con = DriverManager.getConnection("jdbc:derby://localhost:1527/login","login","login");
            ps = con.createStatement();
            SQL_Str="Select * from LOGIN where UName like ('" + UName +"')";
            rs=ps.executeQuery(SQL_Str);
            rs.next();
            dbusername=rs.getString(2).toString();
            dbpassword=rs.getString(3).toString();
  
        }
        catch(Exception ex)
        {
            ex.printStackTrace();
            System.out.println("Exception Occur :" + ex);
        }
    
    }
    
    public Object doLogin() {
        FacesContext context = FacesContext.getCurrentInstance();
dbData(username);
        // Zugangsdaten prüfen
    
        if (username.equalsIgnoreCase(dbusername) && password.equals(dbpassword)) {
            // Wenn Zugangsdaten korrekt: Session holen
            HttpSession session = (HttpSession) context.getExternalContext().getSession(true);
            // In Session speichern, dass der Nutzer eingeloggt ist
            session.setAttribute(LoginPhaseListener.LOGIN_KEY, Boolean.TRUE);
            // Zur Indexseite navigieren
            return "index";
        } else {
            // Logindaten falsch: Fehlermeldung erzeugen
            FacesMessage message = new FacesMessage("Login fehlgeschlagen - Zugangsdaten korrekt?");
            // und im Kontext speichern ("null" bedeutet globale Meldung)
            context.addMessage(null, message);
            /* Resultat "null" wird vom NavigationHandler als Verbleib auf 
             * aktueller View interpretiert
             */
            return null;
        }
    }



//    public String getNutzername() {

    

        public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    /**
     * @return the dbusername
     */
    public String getDbusername() {
        return dbusername;
    }

    /**
     * @param dbusername the dbusername to set
     */
    public void setDbusername(String dbusername) {
        this.dbusername = dbusername;
    }

    /**
     * @return the dbpassword
     */
    public String getDbpassword() {
        return dbpassword;
    }

    /**
     * @param dbpassword the dbpassword to set
     */
    public void setDbpassword(String dbpassword) {
        this.dbpassword = dbpassword;
    }
}

Coder der html:

HTML:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core">
    <f:view>
        <h:head>
            <title>Login</title>
        </h:head>

        <h:body>
            <h2>Bitte anmelden</h2>
            <h:messages/>
            <h:form>
                <h:panelGrid columns="2">    
                    <h:outputLabel for="nutzername" value="Nutzername"/>
                   
                    <h:inputText id="nutzername" value="#{login.username}" required="true"/>

                    <h:outputLabel for="passwort" value="Passwort"/>
                    
                    <h:inputSecret id="passwort" value="#{login.password}" required="true"/>

                    <h:commandButton action="#{login.doLogin}" value="Einloggen"/>
                    
                
                </h:panelGrid>
            </h:form>
            
  
            
        </h:body>
    </f:view>
</html>


Scheint so als ob gar nicht zu der Datenbank verbunden wird. Zugang ist nicht korrekt - admin/admin ist in der Datenbank eingetragen. Pfad und Tabellenname stimmt.

Kann jemand helfen?
 
Zuletzt bearbeitet:
SQL für das einfügen in die Datenbank:

INSERT INTO LOGIN.LOGIN (UNAME, PWORD)
VALUES ('test', 'test')


Um mit der DB zu verbinden ist das hier korrekt**** :

Class.forName("org.apache.derby.jdbc.EmbeddedDriver");

con = DriverManager.getConnection("jdbc:derby://localhost:1527/login", "login", "login");


Mit einem Button regestrieren soll ein neuer Benutzer in die DB geschrieben werden. Funktioniert auch nicht :(

Code:
 public void addUser()
    {
        try
        {
          
               
                Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
            con = DriverManager.getConnection("jdbc:mysql://localhost:1527/login","login","login");
            ps = con.createStatement();
            SQL_Str="INSERT INTO LOGIN.LOGIN (UNAME, PWORD) VALUES ('test', 'test')";
            rs=ps.executeQuery(SQL_Str);
           
  
        }
        catch(Exception ex)
        {
            ex.printStackTrace();
            System.out.println("Exception Occur :" + ex);
        }
    
    }
 
Zuletzt bearbeitet:
Weil es kein Query sondern ein Update ist.

Einfach zu merken: SELECT => executeQuery() => ResultSet, UPDATE/DELETE/INSERT => executeUpdate() => int (Anzahl geänderter Rows.
 
Danke saftmeister... Eintrag in die DB funktioniert jetzt.

Code:
 public void addUser()
    {
        try
        {
      .....
            SQL_Str="INSERT INTO LOGIN.LOGIN (UNAME, PWORD) VALUES ('test', 'test')";
            ps.executeUpdate(SQL_Str);
           
  ...
      
    
    }
 
Weil es kein Query sondern ein Update ist.

Einfach zu merken: SELECT => executeQuery() => ResultSet, UPDATE/DELETE/INSERT => executeUpdate() => int (Anzahl geänderter Rows.


Hast du noch einen Tipp warum der Loogin über die DB nicht funktioniert?


EDIT

hatte die falschen Tabellenspalten versucht abzuspeichern.
Dachte ID = 1 UNAME = 2 und PWORD = 3

korrekt:
dbusername=rs.getString(1).toString();
dbpassword=rs.getString(2).toString();

funktioniert jetzt alles!
 
Zuletzt bearbeitet:
Salve

Hinweise:
Das ist meines Wissens keine "J2EE-konforme" Authentifizierung. Eine J2EE-Authentifizierung wird durch den Applikationsserver durchgeführt. Mach dich mal über die Themen "J2EE form-based authentication" und "Realm" bzw. "JDBC Realm" schlau.

Nicht, dass deine Variante nicht funktionieren würde, aber der Titel lautet ja "J2EE Loginsystem mit Datenbank"...

Unabhängig davon: Dein Bean hält eine Datenbankverbindung. Das kann man natürlich auch so machen, wenn man will, korrekter und eleganter wäre es, wenn auch das durch den Applikationsserver verwaltet würde (Stichwort DataSourcen in Applikationsservern).

Und schöner wäre es auch, wenn du gegen ein Interface entwickeln würdest - du entkoppelst dann damit die Datenzugriffen von deiner Logik, was den Vorteil bringt, dass das Backend ausgetauscht werden kann, ohne die Klassen der Geschäftslogik ändern zu müssen.

rs.getString/getInt/etc -> Hier kann man auch den Namen der Spalte mitgeben, was das ganze leserlicher macht.

Zum Passwort: Best practice ist hier, das PW verschlüsselt (besser gesagt gehash-t) abzulegen. Unter MySQL gibt's eine password-function, bei Oracle kann man da eine sha-Methode nehmen, wenn ich mich richtig erinnere. Somit können Passwörter nicht mehr entschlüsselt werden. Bei der Abfrage muss in der where-clause einfach nur noch das Passwort mit der gleichen Funktion verschlüsselt werden.

Gruss,
slowy
 
Zuletzt bearbeitet:
Zurück