AutenticazioneBasic.java

  1. /*
  2.  * GovWay - A customizable API Gateway
  3.  * https://govway.org
  4.  *
  5.  * Copyright (c) 2005-2025 Link.it srl (https://link.it).
  6.  *
  7.  * This program is free software: you can redistribute it and/or modify
  8.  * it under the terms of the GNU General Public License version 3, as published by
  9.  * the Free Software Foundation.
  10.  *
  11.  * This program is distributed in the hope that it will be useful,
  12.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.  * GNU General Public License for more details.
  15.  *
  16.  * You should have received a copy of the GNU General Public License
  17.  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  18.  *
  19.  */



  20. package org.openspcoop2.pdd.core.autenticazione.pa;

  21. import org.openspcoop2.core.id.IDServizioApplicativo;
  22. import org.openspcoop2.core.id.IDSoggetto;
  23. import org.openspcoop2.core.registry.driver.DriverRegistroServiziNotFound;
  24. import org.openspcoop2.message.OpenSPCoop2Message;
  25. import org.openspcoop2.pdd.config.ConfigurazionePdDManager;
  26. import org.openspcoop2.pdd.config.OpenSPCoop2Properties;
  27. import org.openspcoop2.pdd.core.autenticazione.AutenticazioneException;
  28. import org.openspcoop2.pdd.core.autenticazione.AutenticazioneUtils;
  29. import org.openspcoop2.pdd.core.autenticazione.ParametriAutenticazione;
  30. import org.openspcoop2.pdd.core.autenticazione.ParametriAutenticazioneBasic;
  31. import org.openspcoop2.pdd.core.autenticazione.WWWAuthenticateConfig;
  32. import org.openspcoop2.pdd.core.credenziali.Credenziali;
  33. import org.openspcoop2.pdd.logger.OpenSPCoop2Logger;
  34. import org.openspcoop2.protocol.registry.RegistroServiziManager;
  35. import org.openspcoop2.protocol.sdk.constants.ErroriCooperazione;
  36. import org.openspcoop2.protocol.sdk.constants.IntegrationFunctionError;
  37. import org.openspcoop2.utils.BooleanNullable;
  38. import org.openspcoop2.utils.crypt.CryptConfig;

  39. /**
  40.  * Classe che implementa una autenticazione BASIC.
  41.  *
  42.  * @author Andrea Poli (apoli@link.it)
  43.  * @author $Author$
  44.  * @version $Rev$, $Date$
  45.  */

  46. public class AutenticazioneBasic extends AbstractAutenticazioneBase {

  47.     protected boolean cleanHeaderAuthorization = true;
  48.    
  49.     private boolean logError = true;
  50.     @Override
  51.     public void setLogError(boolean logError) {
  52.         this.logError = logError;
  53.     }
  54.    
  55.     @Override
  56.     public void initParametri(ParametriAutenticazione parametri) throws AutenticazioneException {
  57.         super.initParametri(parametri);
  58.        
  59.         ParametriAutenticazioneBasic authBasic = new ParametriAutenticazioneBasic(this.parametri);
  60.         BooleanNullable cleanNullable = authBasic.getCleanHeaderAuthorization();
  61.         if(cleanNullable!=null && cleanNullable.getValue()!=null) {
  62.             this.cleanHeaderAuthorization = cleanNullable.getValue();
  63.         }
  64.        
  65.     }
  66.    
  67.     @Override
  68.     public EsitoAutenticazionePortaApplicativa process(DatiInvocazionePortaApplicativa datiInvocazione) throws AutenticazioneException{

  69.         EsitoAutenticazionePortaApplicativa esito = new EsitoAutenticazionePortaApplicativa();
  70.        
  71.         if(datiInvocazione==null) {
  72.             throw new AutenticazioneException("Param datiInvocazione is null");
  73.         }
  74.        
  75.         Credenziali credenziali = datiInvocazione.getInfoConnettoreIngresso().getCredenziali();
  76.        
  77.         String user = credenziali.getUsername();
  78.         String password = credenziali.getPassword();

  79.         // NOTA: in http-basic il processo di autenticazione ed il processo di identificazione sono unito a differenza di ssl/principal
  80.         //       le credenziali devono essere verificate all'interno della base dati del registro, che in ugual maniera permette anche di identificare l'attore
  81.         //       Nel caso optional, la transazione continuera' correttamente, ma verra' comunque segnalato le credenziali errate nei diagnostici.
  82.         //       a differenza dei casi ssl/principal dove credenziali che non corrispondono ad alcun attore, non comportano una segnalazione nei diagnostici.
  83.        
  84.         OpenSPCoop2Properties op2Properties = OpenSPCoop2Properties.getInstance();
  85.        
  86.         CryptConfig cryptConfigApplicativi = op2Properties.getCryptConfigAutenticazioneApplicativi();
  87.         CryptConfig cryptConfigSoggetti = op2Properties.getCryptConfigAutenticazioneSoggetti();
  88.         WWWAuthenticateConfig wwwAuthenticateConfig = op2Properties.getRealmAutenticazioneBasicWWWAuthenticateConfig();
  89.        
  90.         // Controllo credenziali fornite
  91.         if( (user==null) || ("".equals(user)) || (password==null) || ("".equals(password)) ){
  92.             esito.setErroreCooperazione(IntegrationFunctionError.AUTHENTICATION_CREDENTIALS_NOT_FOUND, ErroriCooperazione.AUTENTICAZIONE_FALLITA_CREDENZIALI_NON_FORNITE.getErroreCooperazione());
  93.             esito.setClientAuthenticated(false);
  94.             esito.setClientIdentified(false);
  95.             if(wwwAuthenticateConfig!=null) {
  96.                 esito.setWwwAuthenticateErrorHeader(wwwAuthenticateConfig.buildWWWAuthenticateHeaderValue_notFound());
  97.             }
  98.             return esito;
  99.         }
  100.         esito.setCredential(user);
  101.        
  102.         IDSoggetto idSoggetto = null;
  103.         try{
  104.             idSoggetto = RegistroServiziManager.getInstance(datiInvocazione.getState()).getIdSoggettoByCredenzialiBasic(user, password, cryptConfigSoggetti, null); // all registry
  105.         }
  106.         catch(DriverRegistroServiziNotFound notFound){
  107.             OpenSPCoop2Logger.getLoggerOpenSPCoopCore().debug("AutenticazioneBasic (Soggetti) non ha trovato risultati",notFound);
  108.         }
  109.         catch(Exception e){
  110.             if(this.logError) {
  111.                 OpenSPCoop2Logger.getLoggerOpenSPCoopCore().error("AutenticazioneBasic (Soggetti) non riuscita",e);
  112.             }
  113.             esito.setErroreCooperazione(IntegrationFunctionError.INTERNAL_REQUEST_ERROR, ErroriCooperazione.ERRORE_GENERICO_PROCESSAMENTO_MESSAGGIO.getErroreCooperazione());
  114.             esito.setClientAuthenticated(false);
  115.             esito.setClientIdentified(false);
  116.             esito.setEccezioneProcessamento(e);
  117.             return esito;
  118.         }
  119.        
  120.         IDServizioApplicativo idServizioApplicativo = null;
  121.         try {
  122.             if(idSoggetto==null && this.getProtocolFactory().createProtocolConfiguration().isSupportoAutenticazioneApplicativiErogazioni()) {
  123.                 idServizioApplicativo = ConfigurazionePdDManager.getInstance(datiInvocazione.getState()).
  124.                         getIdServizioApplicativoByCredenzialiBasic(user, password, cryptConfigApplicativi);
  125.                 if(idServizioApplicativo!=null) {
  126.                     if(idSoggetto==null) {
  127.                         idSoggetto = idServizioApplicativo.getIdSoggettoProprietario();
  128.                     }
  129.                     // Non ha senso poter identificare entrambi con le stesse credenziali
  130. //                  else if(idServizioApplicativo.getIdSoggettoProprietario().equals(idSoggetto)==false) {
  131. //                      throw new Exception("Identificato sia un soggetto che un applicativo. Il soggetto ["+idSoggetto+
  132. //                              "] identificato รจ differente dal proprietario dell'applicativo identificato ["+idServizioApplicativo.getIdSoggettoProprietario()+"]");
  133. //                  }
  134.                 }
  135.             }
  136.         }
  137.         catch(Exception e){
  138.             if(this.logError) {
  139.                 OpenSPCoop2Logger.getLoggerOpenSPCoopCore().error("AutenticazioneBasic (Applicativi) non riuscita",e);
  140.             }
  141.             esito.setErroreCooperazione(IntegrationFunctionError.INTERNAL_REQUEST_ERROR, ErroriCooperazione.ERRORE_GENERICO_PROCESSAMENTO_MESSAGGIO.getErroreCooperazione());
  142.             esito.setClientAuthenticated(false);
  143.             esito.setClientIdentified(false);
  144.             esito.setEccezioneProcessamento(e);
  145.             return esito;
  146.         }
  147.                
  148.         if(idSoggetto == null){
  149.             esito.setErroreCooperazione(IntegrationFunctionError.AUTHENTICATION_INVALID_CREDENTIALS, ErroriCooperazione.AUTENTICAZIONE_FALLITA_CREDENZIALI_FORNITE_NON_CORRETTE.getErroreCooperazione());
  150.             esito.setClientAuthenticated(false);
  151.             esito.setClientIdentified(false);
  152.             if(wwwAuthenticateConfig!=null) {
  153.                 esito.setWwwAuthenticateErrorHeader(wwwAuthenticateConfig.buildWWWAuthenticateHeaderValue_invalid());
  154.             }
  155.             return esito;
  156.         }
  157.         else {
  158.             esito.setClientAuthenticated(true);
  159.             esito.setClientIdentified(true);
  160.             esito.setIdSoggetto(idSoggetto);
  161.             esito.setIdServizioApplicativo(idServizioApplicativo);
  162.         }
  163.        
  164.         return esito;
  165.        
  166.     }
  167.    
  168.     @Override
  169.     public void cleanPostAuth(OpenSPCoop2Message message) throws AutenticazioneException {
  170.         AutenticazioneUtils.finalizeProcessHeaderAuthorization(message, this.cleanHeaderAuthorization);
  171.     }

  172. }