INTRODUZIONE ALLE MODIFICHE DI SICUREZZA
Nel precedente post abbiamo creato gli utenti, i loro ruoli e le password cablandoli direttamente nel codice in quanto stavamo lavorando ad una fase di test. Le informazioni su username, password e ruoli, devono essere memorizzate nel DBMS, criptando la password. Questo ci viene imposto da Spring ma è senz’altro una buona regola di programmazione. È nella tabella UTENTI cha ha una relazione uno-a-uno con la tabella CLIENTI dove vengono memorizzate le credenziali, USERID e PASSWORD. Nella tabella PROFILI verranno memorizzati i ruoli degli utenti. La relazione è uno-a-molti, ad un utente possono essere associati più ruoli come vedremo.
CREAZIONE UTENTE CON PASSWORD CODIFICATA
La password nella tabella UTENTI dovrà essere criptata. Come prima cosa nella classe ClientiController.java dobbiamo fare l’@Autowired della classe che si occupa di criptare le informazioni.
@Autowired
private BCryptPasswordEncoder passwordEncoder;
Riporto la parte di codice nel metodo di update dove viene criptata la password.
AUTENTICAZIONE CON JPA 2 E I DATI DEL DBMS
Come detto gli utenti e i profili che sono ora cablati direttamente nel codice nella classe di configurazione SecurityConfig.java dovranno essere ricavati dal database relazionale. Per fare ciò creiamo una nuova classe nello strato di servizio che chiameremo CustomUserDetailsService.java. Trattandosi di una classe che si trova nello strato di servizio avrà la notazione @Service, questa volta stiamo inserendo una stringa come parametro della notazione, in pratica stiamo nominando la nostra classe di servizio.
Questa classe deve implementare l’interfaccia UserDetailsService.java che è fondamentale in quanto ci consente di ricavare i dettagli degli utenti.
Il metodo UserDetails dovrà gestire: il CODFIDELITY, la USERID e la PASSWORD, questo perché nella tabella UTENTI abbiamo inserito queste tre informazioni. L’utente quando si deve autenticare dovrà inserire questi tre elementi. Detto questo dobbiamo ricavare anche la password dell’utente. Per fare ciò modifichiamo il codice della classe UtentiDao.java inserendo un nuovo metodo:
Utenti SelByUserIdCodFid(String UserId, String CodFid);
Creiamo la sua implementazione nella classe UtentiDaoImpl.java e gestiamo lo stesso metodo nello strato di servizio.
Adesso che abbiamo implementato questo nuovo metodo continuiamo con l’esame della nostra classe. Otteniamo l’utente con il metodo appena creato, Creiamo un nuovo Oggetto UserBuider e troviamo i profili associati all’utente.
NB: NELLE CLASSI DI SICUREZZA E’ STATO IMPLEMENTATO UN FILTRO CHE PASSA LO UserId NELLA FORMA malbasini@9865234, CIOE’ IL NOME UTENTE E’ SEPARATO DAL CODICE FIDELITY DAL SIMBOLO @. SE PROVI AD INSERIRE UN INDIRIZZO EMAIL COME USERNAME IL METODO ANDRA’ IN ERRORE IN QUANTO VIENE UTILIZZATA L’ISTRUZIONE SPLIT SULLA @. TI INVITO A CONSULTARE IL CODICE E I COMMENTI.
MODIFICA DELLA CLASSE DI CONFIGURAZIONE DELLA SICUREZZA
È arrivato il momento di utilizzare la classe appena implementata.
Stiamo utilizzando una nuova notazione @Qualifier nella quale specifichiamo il nome della classe di cui facciamo l’autowired. Eseguiamo poi l’autowired del nostro DataSource e questo è normale in quanto abbiamo la necessità di recuperare i dati dal nostro DBMS. Il resto del codice è stato commentato, ti invito a leggere i commenti.
IL CONTROLLER
NB:ANCHE SE NON CI SONO RECORD NELLA TABELLA UTENTI IL CONTROLLER CREA UN UTENTE ADMIN CON USERNAME= ADMIN, CODFIDELITY=-1 E PASSWORD IMPOSTATA NEL FILE APPLICATION.PROPERTIES COME DA IMMAGINE RIPORTATA.
DOWNLOAD CODICE DELL’ARTICOLO
Il progetto AlphaShopV8.zip è per il DBMS SQL Server mentre AlphaShopV9.zip è per MySQL.
Scrivi un commento