• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Rozwiązanie problemu logicznego(?) logowania w aplikacji konsolowej

Object Storage Arubacloud
0 głosów
350 wizyt
pytanie zadane 5 lutego 2018 w Java przez must Bywalec (2,980 p.)

Hej hej,

postanowiłem sobie dziś stworzyć ToDo apkę. Stanąłem na problemie z logowaniem. 

Na samym początku mam do wyboru 2 opcję albo stworzenia nowego konta albo zalogowania się już do istniejącego.

Main:

switch (option) {
                        case 1:
                            accountMaker.CreateAccount();
                            isTrue = false;
                            System.out.println("Now let's log into you account.");
                        case 2:
                            System.out.println("loguje"); // tutaj ma byc ta metoda, ktora bedzie odpowiadala za logowanie
                            isTrue = false;
                            break;
                    }

Jako, że nigdy nie bawiłem się jeszcze w bazy danych, także konto trzeba utworzyć w programie :).

Użyłem do tego HashMapy, gdzie key to jest login a value to jest hasło.

Tak wygląda ta klasa:

AccountMaker

import java.util.HashMap;
import java.util.Scanner;

public class AccountMaker {

    private HashMap<String, String> loginDetails = new HashMap<>();
    private Scanner input = new Scanner(System.in);
    private String login, password;

    void CreateAccount() throws InterruptedException {
        System.out.println("Input your login");
        login = input.next();

        System.out.println("Input your password");
        password = input.next();

        loginDetails.put(login, password);
        System.out.println("Account has been created successfully");
        Thread.sleep(2000);
    }
    
}

 

Następnie musimy się zalogować i tutaj mam problem, bo nei wiem jak to zrobić w drugiej klasie.

Mam coś takiego:

AccountLogger

public class AccountLogger {
    private AccountMaker accountMaker;

    private AccountLogger(AccountMaker accountMaker) {
        this.accountMaker = accountMaker;
    }

    private boolean logIntoAccount() {
        
        return true;
    }

}

I teraz nie wiem jak zrobić, by móc się zalogować oraz  sprawdzić czy np. dany użytkownik wpisał dobry key i dobre value.Jak zły key czy value to wyskoczy o tym informacja, jak dobry to wyskoczy informacja ze zalogowano...  Po prostu jak działać na tej HashMapie.

Próbowalem za pomoca gettera HashMapy z klasy AccountMaker, ale bez skutku. Może powinienm użyć czegoś innego aniżeli HashMapy?

Z góy dziękuję za pomoc.

2 odpowiedzi

+1 głos
odpowiedź 5 lutego 2018 przez miro Pasjonat (23,870 p.)
wybrane 7 lutego 2018 przez must
 
Najlepsza

W tej metodzie logIntoAccount to powinieneś podawać hasło i login który chcesz sprawdzić. To tak na szybko:
 

  private boolean logIntoAccount(String login, String password) {
loginDetails = accountMaker.getLoginDetails(); 
          if (loginDetails.containsKey(login) && loginDetails.get(login).equals(password) {
         return true;
        } else {
            return false;
        }
    }

Wcześniej jednak inicjalizujesz accountLogger i wywołujesz na nim metodę logIntoAccount. Ja bym jeszcze się zastanowił nad nazewnictwem np. logIntoAccount oraz pisał CreateAccount z małej litery. 

Później jak już ograniesz trochę javy to zainteresuj się bazą danych lub poćwiczy zapisywanie haseł do pliku, 

komentarz 6 lutego 2018 przez must Bywalec (2,980 p.)

Mam na githubie. Wkleiłbym link, gdybym wiedzial ze tak bedzie lepiej :D Na SO właśnie trzeba wklejać fragmenty kodu. :P Ja usunąłem po prostu to co dałem w pierwszym poście tutaj, bo uważałem, ze jest to niepotrzebne. 

No tak, ja już problem mam rozwiązany. Tylko nie rozumiem dlaczego: 


private HashMap<String, String> loginDetails = accountMaker.getLoginDetails();

To nie sprawia, że nie działam na tej samej mapie.

1
komentarz 6 lutego 2018 przez miro Pasjonat (23,870 p.)
Ponieważ accountMaker utworzone w Main i AccountLogge to dwa różne obiekty. Możesz zmienić ich nazwy np. na accountMaker1 i accountMaker2 i nie będziesz mieć błędu.
komentarz 6 lutego 2018 przez must Bywalec (2,980 p.)
Rozumiem, że mam juz dwa różne obiekty.

Teraz mam to tak zrobione:

https://github.com/must1/ToDoApp

Za pomocą tego konstuktora teraz wszystko działa.

Tylko nie wiem czy dobrze to rozumuje. Przesyłam do AccountLogger obiekt accountMaker, przez co jak używam metod z accountmaker to wszystko się tak jakby zapisuje w AccountLoggerze.
1
komentarz 6 lutego 2018 przez miro Pasjonat (23,870 p.)
W main masz

AccountLogger accountLogger = new AccountLogger(accountMaker);

przez co w konstruktorze bierzesz accountMaker utworzony z maina i przypisujesz go do accountMaker utworzonego w AccountLogger. Czyli operujesz później na jednym obiekcie.

this.accountMaker (z AccountLogger) = accountMaker (z Main);
komentarz 6 lutego 2018 przez must Bywalec (2,980 p.)
Pierwszy raz się z takim czymś spotykam dlatego pytam:P Wciąż jest to dla mnie zawiłe, ale na pewno bardziej przejrzyste niż wcześniej.

Dzięki wielkie ;)!
+1 głos
odpowiedź 5 lutego 2018 przez mbabane Szeryf (79,280 p.)
Niby pomysł dobry, ale wydaje mi się, że nie do końca. Popatrz na to tak. Login i hasło są ze sobą ściśle powiązane więc lepiej będzie jeśli do tego celu stworzysz osobną klasę User z dwoma polami. W mapie możesz trzymać sobie obiekty klasy User. Takie podejście jest bardziej obiektowe niż Twoje. Mapy służą do przechowywania obiektów według jakiegoś klucza, a ten klucz ma jednoznacznie identyfikować cały obiekt w tym wypadku User'a. Jako klucz można zastosować jego login, co prawda będzie to dublowanie informacji, bo w obiekcie User będzie też takie pole, ale w tym wypadku login będzie identyfikował jednoznacznie cały obiekt (można powiedzieć że login będzie polem za indeksowanym co ułatwi wyszukiwanie).

Jak operować na mapie. To musisz wygooglować ponieważ to są podstawy Javy więc znajdziesz mnóstwo poradników w sieci.

Jeśli ktoś podał Ci login to możesz prosto pobrać wartość z mapy poprzez metodę get() (nie musisz iterować po całej mapie, bo masz klucz).

Samo logowanie możesz zrobić tak, że pobierasz z mapy obiekt User, i sprawdzasz prostym ifem czy hasło się zgadza z hasłem podanym przez użytkownika (loginu nie trzeba sprawdzać bo jest sprawdzany z automatu - jeśli login jest zły to hasła i tak nie będą pasować (no chyba że ktoś ma takie samo, ale na to już nie ma rady) lub metoda get zwróci null bo nie będzie użytkownika w "bazie").
komentarz 5 lutego 2018 przez must Bywalec (2,980 p.)

Niestety niezbyt rozumiem ideę tego wszystkiego.

Tworzę klase User w której mam dwa pola dajmy na to:

String name;
String password

W klasie AccountLogger tworzę:

HashMap<User, String> loginDetails = new HashMap<>();

Czy jak? Kompletnie nie rozumiem tego pomysłu ani jego realizacji. Mimo to, dziękuję za odpowiedź :)!

 

1
komentarz 6 lutego 2018 przez mbabane Szeryf (79,280 p.)
HashMap<User, String> loginDetails = new HashMap<>();

Odwrotnie, pierwsza wartość w mapie to klucz, a więc:

HashMap<String, User> loginDetails = new HashMap<>();

Jeśli masz już to, to dalej jest już łatwo bo:

Dodajesz użytkownika poprzez:

String login = "Login";
String password = "haslo";
User newUser = new User(login, password);

loginDetails.put(login, newUser);


a tak pobierasz:

User user = loginDetails.get(login);

//ewentualne sprawdzenie hasla podczas logowania:
if (user.getPassword().equals(password) )
{
    //jakies akcje
}
else
{
    System.out.println("Błędny login lub hasło");
}

trzeba pamiętać ze loginDetails.get(login); może zwrocić nulla.

 

komentarz 6 lutego 2018 przez must Bywalec (2,980 p.)
Bardzo ciekawe rozwiązanie, przy kolejnej apce, a mam już w planach użyję tego.

Tymczasem skoro mam już coś zrobione, to użyje rozwiązania @miro.

Dzięki!
komentarz 8 lutego 2018 przez must Bywalec (2,980 p.)

@mbabane, hej, tak jak juz wspomnialem muszę użyć Twojego rozwiązania. Lecz zacząłem się w tym mieszać przy przerabianiu wszystkiego...ale działa.

Nie rozumiem tego pobierania u Ciebie.

Dlaczego tak robimy:

User user = loginDetails.get(login);

przypisujemy do obiektu user klucz naszej Hashmapy, czyli login i password, kompletnie nie rozumiem tego ruchu.

komentarz 8 lutego 2018 przez must Bywalec (2,980 p.)

@mbabane, Zaktualizowałem mojego githuba, zeby był lepszy pogląd na to: https://github.com/must1/ToDoApp

1
komentarz 8 lutego 2018 przez mbabane Szeryf (79,280 p.)

Ten kawałek kodu pobiera z mapy obiekt, który znajduje się pod kluczem login.

Może przeanalizuj ten przykład. Jeśli dalej nie będziesz za bardzo rozumiał to poczytaj o mapach w javie:

import java.util.HashMap;

public class HashMapExample
{
    public static void main(String[] args)
    {
        HashMap<String, User> userHashMap = new HashMap<>();

        String login;
        String password;

        System.out.println("Dodaje nowe usera");
        login = "login";
        password = "password";
        User user = new User(login, password);
        userHashMap.put(login, user);

        System.out.println("Pobranie z mapy usera o loginie: " + login);
        User user1 = userHashMap.get("login");
        System.out.println(user1);


        System.out.println("Dodanie kolejnego uzytkownika");
        login = "must";
        password = "1234";
        User user2 = new User(login, password);
        userHashMap.put(login, user2);

        System.out.println("Pobranie z mapy usera o loginie: " + login);
        User user21 = userHashMap.get("must");
        System.out.println(user21);

        System.out.println("Próba pobranie użytkownika o loginie, ktorego nie ma w mapie");
        User user3 = userHashMap.get("loginKtoregoNieMaWMapie");
        System.out.println(user3);

    }
}

class User
{
    private String login;
    private String password;

    public User(String login, String password)
    {
        this.login = login;
        this.password = password;
    }

    @Override
    public String toString()
    {
        return "User{" +
                "login='" + login + '\'' +
                ", password='" + password + '\'' +
                "}\n";
    }
}

 

komentarz 8 lutego 2018 przez must Bywalec (2,980 p.)
W sumie nie pamiętam już czego dokładnie nie rozumiałem rano, ale teraz jeszcze bardziej mi się rozjaśniło.

Dzięki wielkie :)

Podobne pytania

0 głosów
2 odpowiedzi 251 wizyt
pytanie zadane 17 maja 2022 w Java przez Arek Kowalski Początkujący (450 p.)
+1 głos
1 odpowiedź 245 wizyt
pytanie zadane 23 kwietnia 2022 w Java przez Czang Kai Shrek Obywatel (1,990 p.)
+1 głos
1 odpowiedź 160 wizyt
pytanie zadane 29 stycznia 2022 w Java przez Bakkit Dyskutant (7,600 p.)

92,573 zapytań

141,423 odpowiedzi

319,645 komentarzy

61,959 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...