Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 26
  1. #1

    Creare un filtro per l'autenticazione

    Vorrei creare un filtro per l'autenticazione. In questa pagina viene spiegato nel dettaglio il funzionamento:
    http://www.html.it/articoli/filtri-d...cazioni-web-1/
    L'unico problema è la mancanza dell'uso delle annotazioni nella Servlet ma è facile modificare il .xml e la relativa classe di java.
    La domanda è questa: dove inserisco il ciclo if di verifica? (se la password di Giampiero è forzajava scrivi ok oppure fai qualcosa se la password è diversa o il nome non esiste fai altro...)
    Se metto il codice if nel filtro B come ragiono con la Servlet?
    È giusto pensarla in questo modo: se il filtro ritorna “true” allora permetti all’utente di fare determinate cose altrimenti bloccalo.
    In pratica vorrei creare un'applicazione che legga da WEB-INF/utenti.txt una matrice contenente user e password di utenti con determinati privilegi. Poi vorrei creare un filtro che verifichi l'esistenza di un utente. Infine vorrei che l'utente autenticato possa salvare in un oggetto java una serie di dati (stringhe e numeri).
    grazie
    Più pratica in futuro...

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da giannino1995 Visualizza il messaggio
    In pratica vorrei creare un'applicazione che legga da WEB-INF/utenti.txt una matrice contenente user e password di utenti con determinati privilegi. Poi vorrei creare un filtro che verifichi l'esistenza di un utente. Infine vorrei che l'utente autenticato possa salvare in un oggetto java una serie di dati (stringhe e numeri).
    grazie
    Se si vuole rendere accessibili certe pagine solo ad utenti "autenticati", l'uso di un filter è una possibilità. Il filter dovrebbe ragionare e funzionare così: c'è in sessione una informazione che dice che l'utente è "loggato"? Se sì, allora fa procedere normalmente la request. Altrimenti, se no, allora fa un redirect ad una pagina di login.

    Gli url della pagina di login e della risorsa (tipicamente una Servlet) che esegue l'autenticazione (a seguito del POST dal form di login) chiaramente devono essere accessibili a tutti. Quindi o non "matchano" con il pattern del filter oppure se il pattern del filter becca anche quelli, li devi escludere tu programmaticamente per permettergli l'accesso sempre e comunque.

    Il succo comunque è: NON è il filter che esegue l'autenticazione. Non deve essere lui a leggere alcun "database" degli utenti, verificare password, ecc... Il filter deve solo: o lasciar passare oppure "bloccare" la request rimandando l'utente al punto dove può autenticarsi.
    Ultima modifica di andbin; 05-08-2018 a 20:57
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  3. #3
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Se si vuole rendere accessibili certe pagine solo ad utenti "autenticati", l'uso di un filter è una possibilità. Il filter dovrebbe ragionare e funzionare così: c'è in sessione una informazione che dice che l'utente è "loggato"? Se sì, allora fa procedere normalmente la request. Altrimenti, se no, allora fa un redirect ad una pagina di login.

    Gli url della pagina di login e della risorsa (tipicamente una Servlet) che esegue l'autenticazione (a seguito del POST dal form di login) chiaramente devono essere accessibili a tutti. Quindi o non "matchano" con il pattern del filter oppure se il pattern del filter becca anche quelli, li devi escludere tu programmaticamente per permettergli l'accesso sempre e comunque.

    Il succo comunque è: NON è il filter che esegue l'autenticazione. Non deve essere lui a leggere alcun "database" degli utenti, verificare password, ecc... Il filter deve solo: o lasciar passare oppure "bloccare" la request rimandando l'utente al punto dove può autenticarsi.
    Faccio una premessa, nell’esercitazione che devo portare a termine devo usare un filtro.
    Adesso ci ragiono su ma se il filtro non esegue l'autenticazione e di questo se ne occupa la servlet allora il filtro è soltanto una classe formalmente inutile perché potrei usare una servlet per fare tutto.
    Questi filtri non mi piacciono neanche un po’, non ne vedo alcuna utilità.
    Grazie per la risposta
    Più pratica in futuro...

  4. #4
    La cosa che non so come fare è verificare se in un oggetto JSON salvato dentro un .txt è presente oppure no un utente.
    Il file con gli utenti è fatto in questo modo:
    codice:
    var JsonUser = {
        Topolino: '0847f0e7601c1a8fb1aca9...3f3532233d27b',
        Pippo: '32649749918e4c03ddbecd96b...d064407b01dd65d0ba',
        Pluto: '2ee5039bd3e74c56e72224472...e2c7bbe2d31669640c067',
        Paperino: '26b8144bd4867c35d22ac0c...3fe45e'
    }
    L'esercitazione richiede di salvare gli utenti in un file .txt. L'idea di usare JSON è stata mia, mi sono complicato eccessivamente la vita secondo te?
    Più avanti dovrò fare altre cose e per queste dovrò usare questa dipendenza:
    codice:
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.9.6</version>
    </dependency>
    per cui ritengo l'approccio non del tutto errato.
    Più pratica in futuro...

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da giannino1995 Visualizza il messaggio
    ma se il filtro non esegue l'autenticazione e di questo se ne occupa la servlet allora il filtro è soltanto una classe formalmente inutile perché potrei usare una servlet per fare tutto.
    No, non hai compreso, mi spiace. Un Filter riceve le request (tutte quelle che "matcha" in base al suo url pattern) PRIMA che arrivino ad una risorsa finale (Servlet, JSP). E può fare svariate cose sulla request e/o sulla response.

    Quote Originariamente inviata da giannino1995 Visualizza il messaggio
    Questi filtri non mi piacciono neanche un po’, non ne vedo alcuna utilità.
    Ti serve più studio ..

    Quote Originariamente inviata da giannino1995 Visualizza il messaggio
    La cosa che non so come fare è verificare se in un oggetto JSON salvato dentro un .txt è presente oppure no un utente.
    Il file con gli utenti è fatto in questo modo:
    codice:
    var JsonUser = {
        Topolino: '0847f0e7601c1a8fb1aca9...3f3532233d27b',
        Pippo: '32649749918e4c03ddbecd96b...d064407b01dd65d0ba',
        Pluto: '2ee5039bd3e74c56e72224472...e2c7bbe2d31669640c067',
        Paperino: '26b8144bd4867c35d22ac0c...3fe45e'
    }
    Un JSON non è proprio il massimo .... beh, per pochi utenti ed una "esercitazione", ovviamente è accettabile.

    Comunque "var JsonUser =" non c'entra niente in un file JSON. Non sei in Javascript!

    Quote Originariamente inviata da giannino1995 Visualizza il messaggio
    L'esercitazione richiede di salvare gli utenti in un file .txt. L'idea di usare JSON è stata mia, mi sono complicato eccessivamente la vita secondo te?
    Ehm ... sì.

    Quote Originariamente inviata da giannino1995 Visualizza il messaggio
    Più avanti dovrò fare altre cose e per queste dovrò usare questa dipendenza:
    codice:
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.9.6</version>
    </dependency>
    per cui ritengo l'approccio non del tutto errato.
    Con il databinding di Jackson, devi creare delle classi che "modellano" il JSON. Problema: hai messo i nomi utente come chiavi dei valori. Ri-mazzata sui piedi ....
    Ultima modifica di andbin; 09-08-2018 a 21:34
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  6. #6
    Un utente deve autenticarsi, scrivere una serie di coordinte e visualizzare su una pagina gli inserimenti.
    Nella prima esercitazione devo caricare gli utenti da un file .txt.
    Nella seconda esercitazione devo caricare gli utenti da un database.
    Il materiale per la prima esercitazione l'ho letto tutto.
    Il file .txt l'ho corretto in queto modo:
    codice:
    Topolino,34363636,
    Pippo,79be4d06440,
    Pluto,be2d31669640,
    Paperino,c63c93bb1032a5,
    Hai detto che il processo di autenticazione deve essere fatto nella Servlet così oggi posso provare a creare uno script che verifichi se la user e la password inserite siano presenti nel file .txt.
    ciao
    Più pratica in futuro...

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da giannino1995 Visualizza il messaggio
    Il file .txt l'ho corretto in queto modo:
    codice:
    Topolino,34363636,
    Pippo,79be4d06440,
    Pluto,be2d31669640,
    Paperino,c63c93bb1032a5,
    Più che ragionevole.

    Quote Originariamente inviata da giannino1995 Visualizza il messaggio
    Hai detto che il processo di autenticazione deve essere fatto nella Servlet così oggi posso provare a creare uno script che verifichi se la user e la password inserite siano presenti nel file .txt.
    Ok, se hai dubbi chiedi. Ma l'importante è che ti sia chiaro a cosa potrebbe servire un Filter in questo contesto. Il Filter NON serve per "autenticare" un utente al login (questo lo deve fare una Servlet). Serve invece per impedire che un utente non autenticato possa accedere a risorse accessibili solo ad utenti autenticati. E fare questo generalmente implica anche l'uso delle "sessioni".
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  8. #8
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Più che ragionevole.


    Ok, se hai dubbi chiedi. Ma l'importante è che ti sia chiaro a cosa potrebbe servire un Filter in questo contesto. Il Filter NON serve per "autenticare" un utente al login (questo lo deve fare una Servlet). Serve invece per impedire che un utente non autenticato possa accedere a risorse accessibili solo ad utenti autenticati. E fare questo generalmente implica anche l'uso delle "sessioni".
    Sempre grazie. Ho sostituito le virgole con spazi, forse è meglio e ho scritto questo:
    1.File .txt:
    codice:
    Topolino c3cd7...
    Pippo 1ffeef258...
    Pluto 47e57669d...
    Paperino 1032a50ac...
    2.Servlet
    codice:
    FromTxtToMatrix rf = new FromTxtToMatrix();
    rf.LeggiFile("WEB-INF/users.txt");
    3.Classe del package
    codice:
    package web1;
    
    import java.io.BufferedReader;
    import java.io.FileReader;
    import java.io.IOException;
    
    public class FromTxtToMatrix {
    
        private String[][] Matrice;
    
        public String[][] LeggiFile(String File) throws IOException {
            FileReader f = new FileReader(File);
            BufferedReader b = new BufferedReader(f);
            int Riga = 0;
            String[] VettoreRiga;
            String StringaRiga = null;
            while(true) {
                StringaRiga=b.readLine();
                if(StringaRiga == null)
                    break;
                VettoreRiga = StringaRiga.split(" ");
                Matrice[Riga++] = VettoreRiga;
            }
            System.out.println(Matrice);
            return Matrice;
        }
    }
    Ottengo però questo errore:
    codice:
    java.io.FileNotFoundException: WEB-INF\users.txt (Impossibile trovare il percorso specificato)
    Ho provato a scrivere:
    codice:
    rf.LeggiFile("..\..\users.txt");
    ma neppure questo funziona:
    codice:
    java.io.FileNotFoundException: ..\..\users.txt (Impossibile trovare il percorso specificato)
    Non riesco a capire come ottenere la URL corretta. Il file si trova dentro WEB-INF\users.txt.
    ciao
    Ultima modifica di giannino1995; 10-08-2018 a 16:58
    Più pratica in futuro...

  9. #9
    Neanche questo funziona:
    codice:
    ServletContext context = getServletContext();
    String fullPath = context.getRealPath("/WEB-INF/users.txt");
    System.out.println(fullPath);
    FromTxtToMatrix rf = new FromTxtToMatrix();
    rf.LeggiFile(fullPath);
    perché ottengo questo:
    codice:
    D:\...\WEB-INF\users.txt
    java.lang.NullPointerException
    Più pratica in futuro...

  10. #10
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da giannino1995 Visualizza il messaggio
    Ho sostituito le virgole con spazi, forse è meglio
    Nì (sì e no). Il punto è che se nel codice fai lo split per 1 solo spazio esatto e chi edita il file non "sapesse" questo particolare preciso e magari un po' artisticamente si mette ad allineare la seconda colonna .... si sballa tutto il parsing del file.
    Quindi se proprio vuoi usare gli spazi, fai la separazione per "uno o più spazi" (cosa banale con una regex per split() di String).

    Quote Originariamente inviata da giannino1995 Visualizza il messaggio
    codice:
    FromTxtToMatrix rf = new FromTxtToMatrix();
    rf.LeggiFile("WEB-INF/users.txt");
    Quello che hai usato sopra è un percorso "relativo" (alla directory corrente). Nelle webapp Java con i servlet container/application server, la directory "corrente" è parecchio vaga, nel senso che dipende da svariati fattori: da quale server è, da come/da dove viene avviato e altro.
    Detto in generale, nelle webapp la directory corrente NON è "usabile". A meno che si abbia pieno controllo e conoscenza su come/dove viene avviato il server, cosa possibile ma non sempre (ad esempio se il server non fosse gestito da te o di tua proprietà).

    Se il file deve stare "dentro" l'applicazione, o lo tratti come "risorsa" (nel senso della ricerca tramite classloader come inteso dai getResource/getResourceAsStream di java.lang.Class) ... o usi altro come il getRealPath di ServletContext (ma attenzione, la applicazione deve essere deployata spacchettata, non servita direttamente da un .war).

    Quote Originariamente inviata da giannino1995 Visualizza il messaggio
    codice:
    public class FromTxtToMatrix {
    
        private String[][] Matrice;
    
        public String[][] LeggiFile(String File) throws IOException {
            FileReader f = new FileReader(File);
            BufferedReader b = new BufferedReader(f);
            int Riga = 0;
            String[] VettoreRiga;
            String StringaRiga = null;
            while(true) {
                StringaRiga=b.readLine();
                if(StringaRiga == null)
                    break;
                VettoreRiga = StringaRiga.split(" ");
                Matrice[Riga++] = VettoreRiga;
            }
            System.out.println(Matrice);
            return Matrice;
        }
    }
    Per niente buono. Sia per le denominazioni, sia per l'uso di una matrice. E tra l'altro (non te ne sei accorto), dove viene istanziata la matrice?? Appunto ...

    Allora: o fai un design diverso, dove la classe è specifica per il "db" degli utenti e "sa" anche DOVE si trova il file. Qualcosa del tipo abbozzato:

    codice:
    public class UserAuthentication {
        // .....
    
        public void authenticate(String username, String password) {
            // cerca lo username nel file
            // se trovato, verifica il match degli hash
            // Nota: per errori, lancia fuori eccezioni.
        }
    }

    Quote Originariamente inviata da giannino1995 Visualizza il messaggio
    rf.LeggiFile("..\..\users.txt");
    Neanche, per quanto detto prima.



    P.S. devi chiarirti le idee su Object Oriented e sul design delle classi.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.