# Login Für Programm



## courtoisjr (3. Dez 2018)

Moin Leute,

ich muss für ein Fach ein Programm schreiben. Dabei handelt es sich um ein Fitnessprogramm, das Trainingspläne erstellen kann. Bin auch schon fast fertig damit und muss nur noch einige Fehler korrigieren. Wie z.B., dass beim anlegen eines Accounts, der Benutzername beliebig Oft benutzt werden kann. Oder auch, dass wenn man kein Passwort eingibt, keine Fehlermeldung kommt. 

Schon mal vielen Dank für eure Hilfe!


----------



## mihe7 (3. Dez 2018)

Hast Du dazu auch eine Frage oder wolltest Du uns nur mal an Deinen Erlebnissen Teil haben lassen?


----------



## courtoisjr (3. Dez 2018)

courtoisjr hat gesagt.:


> Wie z.B., dass beim anlegen eines Accounts, der Benutzername beliebig Oft benutzt werden kann. Oder auch, dass wenn man kein Passwort eingibt, keine Fehlermeldung kommt.


das sind die Fragen.. sooorrryy


----------



## httpdigest (3. Dez 2018)

Diese Fragen sind nicht weit entfernt von "wie mache ich, dass mein Programm funktioniert?"
Sie sind viiiiieeeel zu generisch. Welches Framework verwendest du? Wie sieht dein Code bisher aus? Wo genau hast du Probleme, diese Aspekte zu integrieren? Du musst seeeeehr viel konkreter werden.


----------



## mihe7 (3. Dez 2018)

Das sind keine Fragen, das sind Anforderungen.

Wenn Du wissen willst, wie das funktioniert, solltest Du uns schon etwas mehr erzählen, sonst kann man auch nur allgemeine Antworten geben ("bevor Du einen neuen Account anlegst, musst Du nachsehen, ob es bereits einen Account mit dem Benutzernamen gibt").

Was für eine Art Programm ist das (Konsole, Android, Web-Anwendung mit Spring/Java EE?) Wo werden die Benutzer verwaltet? (Datenbank?)

Nachtrag: s. Antwort von @httpdigest


----------



## courtoisjr (3. Dez 2018)

ich benutze Netbeans und die Nutzer, (sowie auch alles andere) werden selbstverständlich in eine  Datenbank eingetragen. Um genauer zu sein benutze ich dafür HsqlDb. Habe es schon soweit hinbekommen, dass ich Accounts anlegen kann, und diese auch in die Datenbank eingeschrieben werden. Dazu ist es möglich sich einzuloggen und das eigentliche Programm zu nutzen (Trainingspläne zu generieren, zu bearbeiten und komplett neue zu erstellen). Alles wurde mit der objektorientierten Programmiersprache Java geschrieben. 

So nun zu meiner Frage. 
Wenn ich einen neuen Account anlege, kann ich einen bereits verwendeten Benutzernamen, der schon in der DB drin ist, verwenden. Das soll gemieden werden, nur habe ich nicht wirklich eine Ahnung wie ich das gehen soll. In der Theorie schon, nur leider nicht in der Praxis


----------



## Xyz1 (3. Dez 2018)

Du musst es prüfen, ob es den Benutzernamen schon gibt - und weiterhin muss das Passwort x Zeichen lang sein und es muss verschlüsselt und gesalzen gespeichert werden und das am besten mehrmals.


----------



## httpdigest (3. Dez 2018)

Du hast immer noch nicht gesagt, was das technologisch gesehen genau für eine Anwendung ist.
Dass das Java ist, ist ja wohl klar... Und, dass du NetBeans als IDE verwendest, ist irrelevant.
Also hier die Antworten:
1. "Wie kann ich verhindern, dass beim Anlegen eines Accounts der Benutzername beliebig oft genutzt werden kann?"
 -> Indem du prüfst, ob es den Benutzernamen schon gibt (hat ja @mihe7 schon gesagt)
2. "Wie kann ich erreichen, dass, wenn man kein Passwort eingibt, eine Fehlermeldung kommt?"
 - > Indem du prüfst, ob kein Passwort eingegeben wurde, und in diesem Fall eine Fehlermeldung anzeigst.


----------



## Xyz1 (3. Dez 2018)

Sy, ich meinte mind. x Zeichen lang - und ich befürchte, das was Du zur Zeit als Login bezeichnest, kann man noch nicht so nennen....


----------



## Xyz1 (3. Dez 2018)

httpdigest hat gesagt.:


> Diese Fragen sind nicht weit entfernt von "wie mache ich, dass mein Programm funktioniert?"
> Sie sind viiiiieeeel zu generisch


Ich schließe mich an denn mehr kann man ohne Beschreibung dazu nicht tun..


----------



## courtoisjr (3. Dez 2018)

es ist ein Programm, das bei Ausführung in der Konsole von NetBeans abgearbeitet wird


----------



## httpdigest (3. Dez 2018)

courtoisjr hat gesagt.:


> es ist ein Programm, das bei Ausführung in der Konsole von NetBeans abgearbeitet wird


Nein. Es ist anscheinend schonmal ein Swing Client. Soweit so gut. Nun zeig mal, wie du die Datenbank ansprichst. JDBC oder JPA oder was?


----------



## mihe7 (3. Dez 2018)

Ach, Du Scheiße. Jetzt baut der auch noch eine Swing-Anwendung.


----------



## courtoisjr (3. Dez 2018)

```
public class hsql_Verbindung {
   
    private Connection con;
   
    public hsql_Verbindung(){
          try {
            Class.forName("org.hsqldb.jdbc.JDBCDriver");
        } catch (ClassNotFoundException exc) {
            exc.printStackTrace();
            System.exit(-1);
        }
         
          try{
            con = DriverManager.getConnection("jdbc:hsqldb:file:data/Project;ifexists=true","SA","");
                  
        }  
        catch (SQLException ex) {
            Logger.getLogger(Hauptfenster.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
   
   
    public Connection getCon(){
        return this.con;
    }
```


```
public class Hauptfenster extends javax.swing.JFrame {

    Connection conn=null;
    PreparedStatement pst=null;
    ResultSet rs=null;
    DefaultTableModel dm;
    static hsql_Verbindung verbindung;
    ArrayList<Übungen> uebungsliste;
```


----------



## courtoisjr (3. Dez 2018)

```
public PreparedStatement getProfildaten() {
        try {
            return con.prepareStatement("Select Benutzername, Passwort, Körpergrösse, Körpergewicht, Geschlecht, Alter, BMI"
                    + " From Login where Benutzername=? and Passwort=?");
        } catch (SQLException ex) {
            Logger.getLogger(hsql_Verbindung.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }
   
    public PreparedStatement createProfilstatement () {
        try {
            return con.prepareStatement("INSERT INTO Login(Benutzername, Passwort, Körpergrösse, Körpergewicht, Geschlecht, Alter, BMI)" +
                    "VALUES (?,?,?,?,?,?,?)");
        } catch (SQLException ex) {
            Logger.getLogger(hsql_Verbindung.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }
```


----------



## mihe7 (3. Dez 2018)

courtoisjr hat gesagt.:


> public class Hauptfenster extends javax.swing.JFrame


War ja klar.


```
public boolean hasUser(String username) {
    try(PreparedStatement stmt = con.prepareStatement("SELECT 1 FROM Login WHERE Benutzname=?")) {
        stmt.setString(1, username);
        try(ResultSet rs = stmt.executeQuery()) {
            return rs.next();
        }
    }
}
```


----------



## Robat (3. Dez 2018)

courtoisjr hat gesagt.:


> *public* *class* Hauptfenster *extends* javax.swing.JFrame {
> 
> Connection conn=*null*;
> PreparedStatement pst=*null*;
> ...


Deine Klasse, die `Hauptfenster` heißt, macht momentan alles für dich (zumindest wenn man den Variablen glauben schenken mag). Trenn Logik, View und Model strikt von einander, dann bekommst du später weniger Probleme und kannst leichter Fehler finden. 

Die View (also dein "Hauptfenster") muss doch nicht wissen ob die Daten nun aus einer Datenbank, einer Datei, ... o.ä. kommen. Genauso muss die View auch nicht die Daten halten / administrieren.

Ach ja: Warum ist die hsql_Verbindung static?


----------



## mihe7 (3. Dez 2018)

@Robat jetzt hast Du Dich selbst reingeritten


----------



## Robat (3. Dez 2018)

Ich wollte auch mal meinen Senf dazugeben. Mal gucken was daraus wird


----------



## courtoisjr (3. Dez 2018)

Robat hat gesagt.:


> Warum ist die hsql_Verbindung static?


weil meine Main static ist und dort habe ich die db verbindung deklariert.

aber schon mal vielen dank für die ganzen Antworten. Programmiere noch nicht allzu lange.. und bekanntlich wird kein Meister geboren


----------



## mihe7 (3. Dez 2018)

courtoisjr hat gesagt.:


> weil meine Main static ist und dort habe ich die db verbindung deklariert.


Das ist doch kein Grund.



courtoisjr hat gesagt.:


> Programmiere noch nicht allzu lange.. und bekanntlich wird kein Meister geboren


Das nicht, aber wenn Du z. B. Pilot werden willst, setzt Du Dich nicht in eine 747 und fliegst mal drauf los. Hoffe ich wenigstens


----------



## Robat (3. Dez 2018)

courtoisjr hat gesagt.:


> und bekanntlich wird kein Meister geboren


Das verlangt auch keiner. Nur sollte man, wenn möglich, nicht gleich versuchen ein Haus zu bauen, wenn man nicht weiß wie man Zement benutzt


----------



## courtoisjr (3. Dez 2018)

mihe7 hat gesagt.:


> Das ist doch kein Grund


 

da habt ihr wohl recht haben. Aber was soll ich machen, wenn der Prof. uns solch eine Aufgabe stellt? Der Programmier Aspekt in meinem Studium ist bis jetzt relativ knapp ausgefallen. Man könnte es eher mit einem Selbststudium vergleichen  und naja, man versucht halt durchzukommen


----------



## Xyz1 (3. Dez 2018)

courtoisjr hat gesagt.:


> Aber was soll ich machen, wenn der Prof. uns solch eine Aufgabe stellt?


Und was wäre Deine konkrete Frage? Schaue mal in meine Siggi
... ich schaue mal nach.... Genaue Problembeschreiben, SSCCE, wie ist der Sollzustand und wie ist der Istzustand sein, Codeausschnitte und Fehlermeldungen....

Nicht statisch bedeutet, in einem (noch) statischen Teil Deiner Anwendung versuchst Dus mit einer Variablen. Das geht natürlich so nicht, anschauen: Klassen und Objekte....


----------



## mihe7 (3. Dez 2018)

courtoisjr hat gesagt.:


> Man könnte es eher mit einem Selbststudium vergleichen


Das bringt ein Studium so mit sich, dass man sich das ein oder andere auch mal selbst aneignen muss.

Zum Thema: wenn ich es richtig sehe, ist Deine main-Methode auch noch in Hauptfenster?

```
public static void main(String[] args) {
    hsql_Verbindung verbindung = new hsql_Verbindung();
    ... new Hauptfenster(verbindung);
}
```
Dürfte wohl funktionieren, oder?


----------

