AutenticazionePrincipal.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.pd;

  21. import org.openspcoop2.core.config.constants.TipoAutenticazionePrincipal;
  22. import org.openspcoop2.core.id.IDServizioApplicativo;
  23. import org.openspcoop2.core.id.IDSoggetto;
  24. import org.openspcoop2.core.transazioni.utils.TipoCredenzialeMittente;
  25. import org.openspcoop2.message.OpenSPCoop2Message;
  26. import org.openspcoop2.pdd.config.ConfigurazionePdDManager;
  27. import org.openspcoop2.pdd.config.OpenSPCoop2Properties;
  28. import org.openspcoop2.pdd.core.autenticazione.AutenticazioneException;
  29. import org.openspcoop2.pdd.core.autenticazione.AutenticazioneUtils;
  30. import org.openspcoop2.pdd.core.autenticazione.ParametriAutenticazione;
  31. import org.openspcoop2.pdd.core.autenticazione.ParametriAutenticazionePrincipal;
  32. import org.openspcoop2.pdd.core.autenticazione.PrincipalUtilities;
  33. import org.openspcoop2.pdd.core.autenticazione.WWWAuthenticateConfig;
  34. import org.openspcoop2.pdd.logger.OpenSPCoop2Logger;
  35. import org.openspcoop2.protocol.sdk.constants.CodiceErroreIntegrazione;
  36. import org.openspcoop2.protocol.sdk.constants.CostantiProtocollo;
  37. import org.openspcoop2.protocol.sdk.constants.ErroriIntegrazione;
  38. import org.openspcoop2.protocol.sdk.constants.IntegrationFunctionError;
  39. import org.openspcoop2.utils.BooleanNullable;

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

  47. public class AutenticazionePrincipal extends AbstractAutenticazioneBase {

  48.     private TipoAutenticazionePrincipal tipoAutenticazionePrincipal = TipoAutenticazionePrincipal.CONTAINER;
  49.     private String nome = null;
  50.     private String pattern = null;
  51.     private TipoCredenzialeMittente tipoTokenClaim = null; // uso trasporto come custom
  52.     private boolean cleanPrincipal = true;
  53.    
  54.     private boolean logError = true;
  55.     @Override
  56.     public void setLogError(boolean logError) {
  57.         this.logError = logError;
  58.     }

  59.     @Override
  60.     public void initParametri(ParametriAutenticazione parametri) throws AutenticazioneException {
  61.         super.initParametri(parametri);

  62.         ParametriAutenticazionePrincipal authPrincipal = new ParametriAutenticazionePrincipal(this.parametri);
  63.         if(authPrincipal.getTipoAutenticazione()!=null) {
  64.             this.tipoAutenticazionePrincipal = authPrincipal.getTipoAutenticazione();
  65.            
  66.             switch (this.tipoAutenticazionePrincipal) {
  67.             case CONTAINER:
  68.             case INDIRIZZO_IP:
  69.             case INDIRIZZO_IP_X_FORWARDED_FOR:
  70.                 break;
  71.             case HEADER:
  72.                 this.nome = authPrincipal.getNome();
  73.                 if(this.nome==null) {
  74.                     throw new AutenticazioneException("Nome dell'header, da cui estrarre il principal, non indicato");
  75.                 }
  76.                 break;
  77.             case FORM:
  78.                 this.nome = authPrincipal.getNome();
  79.                 if(this.nome==null) {
  80.                     throw new AutenticazioneException("Nome del parametro della query, da cui estrarre il principal, non indicato");
  81.                 }
  82.                 break;
  83.             case URL:
  84.                 this.pattern = authPrincipal.getPattern();
  85.                 if(this.pattern==null) {
  86.                     throw new AutenticazioneException("Espressione Regolare, da utilizzare sulla url per estrarre il principal, non indicata");
  87.                 }
  88.                 break;
  89.             // Ho levato il contenuto, poichè senno devo fare il digest per poterlo poi cachare
  90. /**             case CONTENT:
  91. //                  this.pattern = authPrincipal.getPattern();
  92. //                  if(this.pattern==null) {
  93. //                      throw new AutenticazioneException("Pattern, da utilizzare per estrarre dal contenuto il principal, non indicato");
  94. //                  }
  95. //                  break;*/
  96.             case TOKEN:
  97.                 this.tipoTokenClaim = authPrincipal.getTokenClaim();
  98.                 if(this.tipoTokenClaim==null) {
  99.                     throw new AutenticazioneException("Token Claim, da cui estrarre il principal, non indicato");
  100.                 }
  101.                 if(TipoCredenzialeMittente.TRASPORTO.equals(this.tipoTokenClaim)) {
  102.                     this.nome = authPrincipal.getNome();
  103.                     if(this.nome==null) {
  104.                         throw new AutenticazioneException("Nome del token claim, da cui estrarre il principal, non indicato");
  105.                     }
  106.                 }
  107.                 break;
  108.             }
  109.            
  110.             BooleanNullable cleanNullable = authPrincipal.getCleanPrincipal();
  111.             if(cleanNullable!=null && cleanNullable.getValue()!=null) {
  112.                 this.cleanPrincipal = cleanNullable.getValue();
  113.             }
  114.         }
  115.        
  116.     }
  117.    
  118.     @Override
  119.     public String getSuffixKeyAuthenticationResultInCache(DatiInvocazionePortaDelegata datiInvocazione) {
  120.         switch (this.tipoAutenticazionePrincipal) {
  121.         case CONTAINER:
  122.             return null;
  123.         case HEADER:
  124.         case FORM:
  125.         case URL:
  126.         case INDIRIZZO_IP:
  127.         case INDIRIZZO_IP_X_FORWARDED_FOR:
  128.         case TOKEN:
  129.             if(datiInvocazione==null) {
  130.                 return null;
  131.             }
  132.             try {
  133.                 return PrincipalUtilities.getPrincipal(this.tipoAutenticazionePrincipal, this.nome, this.pattern, this.tipoTokenClaim,
  134.                         datiInvocazione.getInfoConnettoreIngresso(), this.getPddContext(), false,
  135.                         new StringBuilder());
  136.             }catch(Exception e) {
  137.                 return null;
  138.             }
  139.         // Ho levato il contenuto, poichè senno devo fare il digest per poterlo poi cachare
  140. /**     case CONTENT:*/
  141.         }
  142.         return null;
  143.     }
  144.    
  145.     @Override
  146.     public EsitoAutenticazionePortaDelegata process(DatiInvocazionePortaDelegata datiInvocazione) throws AutenticazioneException{

  147.         EsitoAutenticazionePortaDelegata esito = new EsitoAutenticazionePortaDelegata();
  148.        
  149.         if(datiInvocazione==null) {
  150.             throw new AutenticazioneException("Param datiInvocazione is null");
  151.         }
  152.        
  153.         OpenSPCoop2Properties op2Properties = OpenSPCoop2Properties.getInstance();
  154.         WWWAuthenticateConfig wwwAuthenticateConfig = op2Properties.getRealmAutenticazionePrincipalWWWAuthenticateConfig(this.tipoAutenticazionePrincipal);
  155.        
  156.         IDSoggetto soggettoFruitore = null;
  157.         if(datiInvocazione.getPd()!=null) {
  158.             soggettoFruitore = new IDSoggetto(datiInvocazione.getPd().getTipoSoggettoProprietario(), datiInvocazione.getPd().getNomeSoggettoProprietario());
  159.         }
  160.        
  161.         StringBuilder fullCredential= new StringBuilder();
  162.        
  163.         // Controllo credenziali fornite
  164.         String principal = null;
  165.         try {
  166.             principal = PrincipalUtilities.getPrincipal(this.tipoAutenticazionePrincipal, this.nome, this.pattern, this.tipoTokenClaim,  
  167.                     datiInvocazione.getInfoConnettoreIngresso(), this.getPddContext(), true,
  168.                     fullCredential);
  169.         }catch(Exception e) {
  170.             if(this.logError) {
  171.                 OpenSPCoop2Logger.getLoggerOpenSPCoopCore().error("AutenticazionePrincipal non riuscita",e);
  172.             }
  173.             esito.setErroreIntegrazione(IntegrationFunctionError.AUTHENTICATION_CREDENTIALS_NOT_FOUND, ErroriIntegrazione.ERRORE_402_AUTENTICAZIONE_FALLITA.getErrore402_AutenticazioneFallitaPrincipal(CostantiProtocollo.CREDENZIALI_NON_FORNITE,principal));
  174.             esito.setClientAuthenticated(false);
  175.             esito.setClientIdentified(false);
  176.             if(wwwAuthenticateConfig!=null) {
  177.                 esito.setWwwAuthenticateErrorHeader(wwwAuthenticateConfig.buildWWWAuthenticateHeaderValue_notFound());
  178.             }
  179.             return esito;
  180.         }
  181.         if( principal==null || "".equals(principal) ){
  182.             esito.setErroreIntegrazione(IntegrationFunctionError.AUTHENTICATION_CREDENTIALS_NOT_FOUND, ErroriIntegrazione.ERRORE_402_AUTENTICAZIONE_FALLITA.getErrore402_AutenticazioneFallitaPrincipal(CostantiProtocollo.CREDENZIALI_NON_FORNITE,principal));
  183.             esito.setClientAuthenticated(false);
  184.             esito.setClientIdentified(false);
  185.             if(wwwAuthenticateConfig!=null) {
  186.                 esito.setWwwAuthenticateErrorHeader(wwwAuthenticateConfig.buildWWWAuthenticateHeaderValue_notFound());
  187.             }
  188.             return esito;
  189.         }
  190.        
  191.         // per conoscere la credenziale passata anche in caso di autenticazione fallita
  192.         esito.setFullCredential(fullCredential.toString());
  193.        
  194.         // Essendoci il principal del chiamante, il client e' stato autenticato dal container
  195.         esito.setClientAuthenticated(true);
  196.         esito.setCredential(principal);
  197.         esito.setEnrichPrincipal(true);
  198.        
  199.         IDServizioApplicativo idServizioApplicativo = null;
  200.         try{
  201.             idServizioApplicativo = ConfigurazionePdDManager.getInstance(datiInvocazione.getState()).
  202.                         getIdServizioApplicativoByCredenzialiPrincipal(principal);
  203.             if(idServizioApplicativo!=null && soggettoFruitore==null) {
  204.                 soggettoFruitore = idServizioApplicativo.getIdSoggettoProprietario();
  205.             }
  206.         }catch(Exception e){
  207.             if(this.logError) {
  208.                 OpenSPCoop2Logger.getLoggerOpenSPCoopCore().error("AutenticazionePrincipal non riuscita",e);
  209.             }
  210.             esito.setErroreIntegrazione(IntegrationFunctionError.INTERNAL_REQUEST_ERROR, ErroriIntegrazione.ERRORE_5XX_GENERICO_PROCESSAMENTO_MESSAGGIO.
  211.                     get5XX_ErroreProcessamento(CodiceErroreIntegrazione.CODICE_536_CONFIGURAZIONE_NON_DISPONIBILE));
  212.             esito.setClientIdentified(false);
  213.             esito.setEccezioneProcessamento(e);
  214.             return esito;
  215.         }
  216.        
  217.         if(idServizioApplicativo == null){
  218.             // L'identificazione in principal non e' obbligatoria
  219.             /**esito.setErroreIntegrazione(ErroriIntegrazione.ERRORE_402_AUTENTICAZIONE_FALLITA.getErrore402_AutenticazioneFallitaPrincipal(CostantiProtocollo.CREDENZIALI_FORNITE_NON_CORRETTE,principal));*/
  220.             esito.setClientIdentified(false);
  221.             return esito;
  222.         }
  223.         else {
  224.             if(OpenSPCoop2Properties.getInstance().isAutenticazionePrincipalPortaDelegataCheckSoggettiProprietari() && !idServizioApplicativo.getIdSoggettoProprietario().equals(soggettoFruitore)) {
  225.                 esito.setErroreIntegrazione(IntegrationFunctionError.AUTHENTICATION_INVALID_CREDENTIALS,
  226.                         ErroriIntegrazione.ERRORE_402_AUTENTICAZIONE_FALLITA.
  227.                             getErrore402_AutenticazioneFallitaPrincipal("soggetto proprietario ("+idServizioApplicativo.getIdSoggettoProprietario()+") dell'applicativo identificato ("+idServizioApplicativo.getNome()+") differente dal soggetto proprietario della porta invocata ("+soggettoFruitore+")",principal));
  228.                 esito.setClientIdentified(false);
  229.                 return esito;
  230.             }
  231.             else {
  232.                 esito.setClientIdentified(true);
  233.                 esito.setIdServizioApplicativo(idServizioApplicativo);
  234.             }
  235.         }
  236.        
  237.         return esito;
  238.        
  239.     }

  240.     @Override
  241.     public void cleanPostAuth(OpenSPCoop2Message message) throws AutenticazioneException {
  242.         AutenticazioneUtils.finalizeProcessPrincipal(message, this.tipoAutenticazionePrincipal, this.nome, this.cleanPrincipal);
  243.     }
  244. }