Migliorare la mia applicazione (domande generali)

di il
6 risposte

Migliorare la mia applicazione (domande generali)

Sto realizzando un’applicazione che ha il compito di permettere agli utenti di registrarsi, di essere abilitati da altri utenti e di cambiare la propria password e altre cosette ancora da fare.
Per ora sono solo riuscito a scrivere la fase di login e di registrazione.
Ho le seguenti domande che vi metto in ordine sparso:
1) È possibile configurare Spring Security in modo che i nomi per i ruoli non debbano necessariamente iniziare con "ROLE_"? Dovrei editare ConfigurazioneSpringSecurity che estende WebSecurityConfigurerAdapter oppure dovrei modificare tante altre cose della mia WebApp?
2) È possibile decidere di non inserire nel file .war la classe contenente i test e la classe CrittografarePassword.java che oltre a non servire possono contenere delle informazioni non proprio bellissime. CrittografarePassword.java è una classe con un metodo main() che mi permette di ottenere la password crittografata dell’utente più importante dell’applicazione.
3) È possibile non inserire nel file .war la cartella INFO-WEBAPP con tutto quello che c'è dentro dove salvo note personali che non vorrei mettere sul server (descrizione webapp, procedura per caricare l’app su un IDE, dispense, PDF, ecc…).
4) Come faccio a verificare cosa accade quando scrivo un carattere che non sia in UTF-8 nel form di registrazione e quindi essere certo che la webapp non crolli inesorabilmente e si raggiunga la pagina error.html di Thymeleaf?
5) Nella classe di test quali test potrei/dovrei fare prima di procedere con il resto dell’applicazione? Dovrei simulare la registrazione di un utente? Come si fa questa operazione?

6 Risposte

  • Re: Migliorare la mia applicazione (domande generali)

    iBaffiPro ha scritto:


    1) È possibile configurare Spring Security in modo che i nomi per i ruoli non debbano necessariamente iniziare con "ROLE_"? Dovrei editare ConfigurazioneSpringSecurity che estende WebSecurityConfigurerAdapter oppure dovrei modificare tante altre cose della mia WebApp?
    Sicuramente sì, si possono cambiare, perché mi era già capitato di leggere qualcosa a riguardo (ma non ricordo dove). Ma non ti so dire più, dovresti vedere la reference ufficiale o fare qualche ricerca.

    iBaffiPro" post_id="8675918 ha scritto:


    2) È possibile decidere di non inserire nel file .war la classe contenente i test e la classe CrittografarePassword.java che oltre a non servire possono contenere delle informazioni non proprio bellissime. CrittografarePassword.java è una classe con un metodo main() che mi permette di ottenere la password crittografata dell’utente più importante dell’applicazione.
    Le classi di test (src/test/java/****) già di norma NON vanno a finire nel package finale (jar, war o altro che sia). Eventualmente solo le classi di test possono essere impacchettate in un jar apposito ma è una cosa che si fa raramente.

    Se si vuole escludere una risorsa (classe o altro) dal war, si configura il maven-war-plugin (ecco un caso in cui va esplicitato nel pom) usando il <packagingExcludes> .
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-war-plugin</artifactId>
        <configuration>
            <packagingExcludes>WEB-INF/classes/nome/del/package/NomeClasse.class</packagingExcludes>
        </configuration>
    </plugin>
    Deve essere proprio così il path, come sarebbe strutturato nel war. Più path sono separati dalla virgola. E la documentazione dice che si possono anche usare le Regular Expressions.
    Verifica poi naturalmente il contenuto del war!

    iBaffiPro" post_id="8675918 ha scritto:


    3) È possibile non inserire nel file .war la cartella INFO-WEBAPP con tutto quello che c'è dentro dove salvo note personali che non vorrei mettere sul server (descrizione webapp, procedura per caricare l’app su un IDE, dispense, PDF, ecc…).
    Se definisci cartelle in locazioni che NON sono note a Maven/IDE, non c'è nessun problema. Se ad esempio al livello di src metti es.

    src\*****
    note\*****
    sql\*****

    Maven e l'IDE non "sanno" nulla di note e sql, nessun contenuto di queste finirà mai di per sè in un package finale, né verrà usato a runtime. Restano solo nel tuo progetto.

    iBaffiPro ha scritto:


    4) Come faccio a verificare cosa accade quando scrivo un carattere che non sia in UTF-8 nel form di registrazione e quindi essere certo che la webapp non crolli inesorabilmente e si raggiunga la pagina error.html di Thymeleaf?
    Caratteri sballati in un form comunque in generale NON fanno fallire una request. Mal che vada le stringhe che il backend riceve sono appunto sballate (se poi il BE schianta per quello è un altro discorso ...).

    Queste questioni sull'encoding, specialmente per i dati che vanno da client (browser) a server sono sempre un po' spinose. Assicurati che la pagina sia scritta e dichiarata in UTF-8. Prova a mettere in un form un classico es. áéíóú , verifica con i developer tool del browser che la POST abbia il body corretto e sul BE in debugging verifica lo String che ti arriva. Se vedi "áéíóú" ragionevolmente non ci sono casini. Se invece vedi altro .....
    E testa con più browser.

    iBaffiPro ha scritto:


    5) Nella classe di test quali test potrei/dovrei fare prima di procedere con il resto dell’applicazione? Dovrei simulare la registrazione di un utente? Come si fa questa operazione?
    Per i test le possibilità sono molto ampie. Dipende molto da cosa vuoi testare, cioè da dove partire "di sopra", fino ad arrivare a che livello "di sotto" e quindi mockando che cosa.
    Se hai la classica struttura controller -> service -> dao, puoi testare con unit test solo lo strato di controller, solo lo strato di service o entrambi (che diventa più un "integration" test dato che spanna due strati). Generalmente il dao nei test diventa un "mock" fittizio, NON si va normalmente su una base dati reale. Cioè sì, si può fare ma come forse ti avevo già detto, testare su una base dati persistente è più critico e ci vogliono più accorgimenti per rendere davvero i test indipendenti tra di loro.
  • Re: Migliorare la mia applicazione (domande generali)

    1) Ok, l'ho trovato, era più semplice di quanto pensassi, avevi perfettamente ragione.
    2) Grazie, il tuo codice funziona alla grande!

    Ho anche rimosso uno dei due file .properties ma mi sorge un altro dubbio. Non è rischioso lasciare in chiaro la password del DB nel .properties? Tu come ti comporti?
    3) Ok, grazie.
    4) Ok, grazie.
    5) E' complesso fare un test di questo tipo:
    Accedo alla pagina registrazione.html;
    Mi registro con nome "Mario Rossi" e password "bdsjudbEGV£%$&6756";
    Verifico che venga dirottato verso registrazione-eseguita.html;
    Verifico che in registrazione-eseguita.html sia presente il tag:
    <li>Nome utente: <span class="successo">Mario Rossi</span></li>
    Riesci ad incollarmi un codice che posso riadattare al mio contesto?
    E' una cosa complicata?
    Dovrei leggere 1200 pagine di qualche libro?
  • Re: Migliorare la mia applicazione (domande generali)

    Per rimuovere ROLE_ ho trovato questo codice:
    
        @Bean
        public JwtAuthenticationConverter jwtAuthenticationConverter() {
            JwtGrantedAuthoritiesConverter grantedAuthoritiesConverter = new JwtGrantedAuthoritiesConverter();
            grantedAuthoritiesConverter.setAuthorityPrefix("ROLE_");
    
            JwtAuthenticationConverter jwtAuthenticationConverter = new JwtAuthenticationConverter();
            jwtAuthenticationConverter.setJwtGrantedAuthoritiesConverter(grantedAuthoritiesConverter);
            return jwtAuthenticationConverter;
        }
    
    https://docs.spring.io/spring-security/site/docs/current/reference/html5/#el-common-built-in
    Ma non riesco a capire come importare JwtAuthenticationConverter.
    Ho provato così:
    import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationConverter;
    Ho anche provato ad importare questa dipendenza:
    https://mvnrepository.com/artifact/org.springframework.security.oauth/spring-security-oauth2/2.5.1.RELEASE
    ma non basta.
    Su internet si provano dei @Bean più semplici ma danno problemi con alcuni componenti Thymeleaf.
  • Re: Migliorare la mia applicazione (domande generali)

    Per impostazione predefinita, se il ruolo fornito non inizia con 'ROLE_' verrà aggiunto. Questo può essere personalizzato modificando defaultRolePrefixon in DefaultWebSecurityExpressionHandler. Così leggo sulla documentazione ufficiale.
    11.3.1. Overview - https://docs.spring.io/spring-security/site/docs/current/reference/html5/#el-common-built-in
    Dai, siamo onesti, secondo te questa sarebbe una documentazione di valore? A me pare della gran spazzatura!
    Forse ho trovato uno script che funziona ma non l'ho trovato sulla documentazione ufficiale ma nelle risposta di un utente di un forum.
    Inoltre, ti dico di più, è un codice articolato, complesso, anzi incomprensibile e che non ci si arriva ragionando.
    Tra qualche mese deciderò di aggiornare la versione di Spring Boot e tutto smetterà di funzionare.
    A quel punto mi chiederò perché e capire che la ragione sarà dovuta a quel codice di quel utente su quel forum sarà un'impresa.
    Spring ha della documentazione spazzatura, pensala come vuoi, io la penso così.
    Tu stesso, che sei un super esperto dell'informatica, non hai saputo dirmi quale fosse quel codice e questo conferma la mia tesi.
    Dimenticavo... di codici su internet ce ne sono tanti ma non vanno mica tutti bene... io ne ho trovato uno dopo 10000 tentativi...
    Ogni tanto sento dire che Spring ha un progresso di apprendimento lungo ma la verità è un'altra: Spring ha libri spazzatura ed una documentazione indecorosa.
  • Re: Migliorare la mia applicazione (domande generali)

    iBaffiPro ha scritto:


    Per impostazione predefinita, se il ruolo fornito non inizia con 'ROLE_' verrà aggiunto. Questo può essere personalizzato modificando defaultRolePrefixon in DefaultWebSecurityExpressionHandler. Così leggo sulla documentazione ufficiale.
    11.3.1. Overview - https://docs.spring.io/spring-security/site/docs/current/reference/html5/#el-common-built-in
    Dai, siamo onesti, secondo te questa sarebbe una documentazione di valore? A me pare della gran spazzatura!
    Sì la documentazione dice proprio così:

    By default if the supplied role does not start with 'ROLE_' it will be added. This can be customized by modifying the defaultRolePrefix on DefaultWebSecurityExpressionHandler.

    Hai guardato come è fatto DefaultWebSecurityExpressionHandler?

    public class DefaultWebSecurityExpressionHandler extends AbstractSecurityExpressionHandler<FilterInvocation>
    implements SecurityExpressionHandler<FilterInvocation> {

    Hai provato a vedere CHI usa SecurityExpressionHandler<FilterInvocation>? Una banale ricerca nel mio IDE (Eclipse) dice che è usato da WebSecurity, per la precisione in WebSecurity ci sono i campi:
    	private DefaultWebSecurityExpressionHandler defaultWebSecurityExpressionHandler = new DefaultWebSecurityExpressionHandler();
    
    	private SecurityExpressionHandler<FilterInvocation> expressionHandler = this.defaultWebSecurityExpressionHandler;
    Ovvero il expressionHandler per default è un DefaultWebSecurityExpressionHandler. E c'è naturalmente un metodo expressionHandler che riceve il handler e restituisce lo stesso WebSecurity. Ovvero è un metodo stile "builder" per configurare il WebSecurity.

    E nel WebSecurityConfigurerAdapter (che tu già conosci!!) c'è guarda caso un metodo configure(WebSecurity web)

    Quindi nella tua classe:
    @Configuration
    @EnableWebSecurity
    public class ConfigurazioneSpringSecurity extends WebSecurityConfigurerAdapter {
    
        @Override
        public void configure(WebSecurity webSecurity) throws Exception {
            webSecurity.expressionHandler(  ....passi un DefaultWebSecurityExpressionHandler con defaultRolePrefix "" .... );
        }
    }
    Hai provato a farlo? Sì o no?

    Io tutto questo l'ho scoperto in meno di 5 minuti, semplicemente guardando e navigando nel mio IDE (Eclipse) e soprattutto SENZA fare ricerche in internet .....
  • Re: Migliorare la mia applicazione (domande generali)

    Nella mia classe questo pezzo non c'è già più (sto usando Spring Boot 2.5.1):
    private SecurityExpressionHandler<FilterInvocation> expressionHandler = this.defaultWebSecurityExpressionHandler;
    ma c'è questo:
    
        public WebSecurity(ObjectPostProcessor<Object> objectPostProcessor) {
            super(objectPostProcessor);
            this.expressionHandler = this.defaultWebSecurityExpressionHandler;
            this.postBuildAction = () -> {
            };
        }
    
    Il metodo che uso io è molto più complesso di quello che descrivi tu, c'è anche WebSecurityExpressionRoot.
    Insomma, sono sincero, io non sarei stato in grado di fare tanto. E' troppo complicato scrivere codice di questo tipo.
    Inoltre non è detto che tra qualche mese, passando alla 2.6.0 quel metodo non sia nuovamente da riscrivere.
    Non mi fido e lascio ROLE_ con grande delusione.
    La cosa strana è che "ROLE_" compare qui:
    //
    // Source code recreated from a .class file by IntelliJ IDEA
    // (powered by FernFlower decompiler)
    //
    
    package org.springframework.security.web.access.expression;
    
    import org.springframework.security.access.expression.AbstractSecurityExpressionHandler;
    import org.springframework.security.access.expression.SecurityExpressionHandler;
    import org.springframework.security.access.expression.SecurityExpressionOperations;
    import org.springframework.security.authentication.AuthenticationTrustResolver;
    import org.springframework.security.authentication.AuthenticationTrustResolverImpl;
    import org.springframework.security.core.Authentication;
    import org.springframework.security.web.FilterInvocation;
    import org.springframework.util.Assert;
    
    public class DefaultWebSecurityExpressionHandler extends AbstractSecurityExpressionHandler<FilterInvocation> implements SecurityExpressionHandler<FilterInvocation> {
        private AuthenticationTrustResolver trustResolver = new AuthenticationTrustResolverImpl();
        private String defaultRolePrefix = "ROLE_";
    
        public DefaultWebSecurityExpressionHandler() {
        }
    
        protected SecurityExpressionOperations createSecurityExpressionRoot(Authentication authentication, FilterInvocation fi) {
            WebSecurityExpressionRoot root = new WebSecurityExpressionRoot(authentication, fi);
            root.setPermissionEvaluator(this.getPermissionEvaluator());
            root.setTrustResolver(this.trustResolver);
            root.setRoleHierarchy(this.getRoleHierarchy());
            root.setDefaultRolePrefix(this.defaultRolePrefix);
            return root;
        }
    
        public void setTrustResolver(AuthenticationTrustResolver trustResolver) {
            Assert.notNull(trustResolver, "trustResolver cannot be null");
            this.trustResolver = trustResolver;
        }
    
        public void setDefaultRolePrefix(String defaultRolePrefix) {
            this.defaultRolePrefix = defaultRolePrefix;
        }
    }
    
    e non capisco perché sovrascrivendo setDefaultRolePrefix oppure defaultRolePrefix non si riesca a modificare questo benedetto ruolo con 2 o massimo 3 righe di codice.
Devi accedere o registrarti per scrivere nel forum
6 risposte