In Drupal 9, non è raccomandato utilizzare il login condiviso in un multi - site come si faceva in Drupal 7.

Ad ogni modo, finché non adottiamo una politica e non troviamo soprattutto una valida alternativa a riguardo,

si possa procedere in questo modo.

  • In /sites/default/services.yml si deve aggiungere un cookie_domain, senza non funziona.
  • In /sites/default/settings.php non occorre nessuna modifica
  • In /sites/federato/settings.php bisogna aggiungere delle tabelle di DB che sono condivise con il db di default, quali (users, users_data, users_field_data, sessions,sequences)
  • Tutti i siti del multi - site devono essere in https.


Ho fatto questa configurazione in unibgd9, si possa prendere riferimento da quella.

Siccome non funziona in http, ci sono alcuni accorgimenti per condividere o meno le tabelle e services con il cookie_domain. Lasciare il cookie_domain quando non si possa condividere provoca che non si entra più nei siti. Il cookie domain deve cominciare con un punto (.) obbligatoriamente.

/sites/default:


/sites/default/services.yml

/sites/default/services.yml
parameters:
  session.storage.options:
    cookie_domain: '.unibg.it'



Quindi oltre le variabili di Drupal, vengono utilizzate anche le variabili di Cineca, come si faceva in Drupal 7.

Quindi si recupera il nome del DB di default, salvato in /drupal/dim_prod/common/common_settings/file

e se il sito non è in http ( if($base_insecure_url != $base_url)) allora si condividono le tabelle

Per il preprod siccome possa avere https ma non sempre, c'è la condizione di metterlo in services.preprod2 il quale altro non è che con cookie_domain nessuno.


cen00
if (file_exists('/drupal/dim_prod/common/common_settings/unibgd9-cen00-site-settings.php')) {
  // select default DB for users
  require_once('/drupal/dim_prod/common/common_settings/unibgd9-default-site-settings.php');
  $mydefault = $database_credentials[$deploy_env_name]['name'];

  // correct require
  require_once('/drupal/dim_prod/common/common_settings/unibgd9-cen00-site-settings.php');

  if (isset($deploy_env_name) && ($deploy_env_name == 'prod' || $deploy_env_name == 'preprod') && !empty($mydefault) ) {
    if($base_insecure_url != $base_url){
      $databases['default']['default']['prefix'] = array(
        'default'   => '',
        'users'     => $mydefault . '.',
        'users_data'     => $mydefault . '.',
        'users_field_data'     => $mydefault . '.',
        'sessions'  => $mydefault . '.',
        'sequences' => $mydefault . '.',
      );  
    }
  }
}
if (isset($deploy_env_name) && $deploy_env_name == 'prod' ) {
  $servicesFile = "services.yml";
  $name = "cen00-unibgd9-d8cl5.prod.cineca.it";

  if($base_insecure_url != $base_url){
    if ((substr_compare($_SERVER['SERVER_NAME'], $name, -strlen($name) ) === 0)) {
      $servicesFile = 'services.prod.cineca.yml';  
    }else{
      $servicesFile = 'services.prod.yml';
    }  
  }
  $settings['container_yamls'][] = $app_root . '/' . $site_path . '/' . $servicesFile;
}

if (isset($deploy_env_name) && $deploy_env_name == 'preprod' ) {
  $servicesFile = "services.yml";
  if($base_insecure_url != $base_url){
    $servicesFile = 'services.preprod.yml';  
  }
  $settings['container_yamls'][] = $app_root . '/' . $site_path . '/' . $servicesFile; 
}


La cosa del cookie domain è molto sensibile, quindi va considerato ogni singolo indirizzo da quelli che utilizziamo.

No cookie_domain, no shared login:

Cookie_domain, shared login :


/sites/default/settings.php

/sites/default/settings.php
if (file_exists('/drupal/dim_prod/common/common_settings/unibgd9-default-site-settings.php')) {
    require_once('/drupal/dim_prod/common/common_settings/unibgd9-default-site-settings.php');
    
    
    if (isset($deploy_env_name) && $deploy_env_name == 'prod' ) {
      $servicesFile = "services.yml";
      $name = "default-unibgd9-d8cl5.prod.cineca.it";

      if($base_insecure_url != $base_url){
        if ((substr_compare($_SERVER['SERVER_NAME'], $name, -strlen($name) ) === 0)) {
          $servicesFile = 'services.prod.cineca.yml';  
        }else{
          $servicesFile = 'services.prod.yml';
        }  
      }
      $settings['container_yamls'][] = $app_root . '/' . $site_path . '/' . $servicesFile;
    }
    
    if (isset($deploy_env_name) && $deploy_env_name == 'preprod' ) {
      $servicesFile = "services.yml";
      if($base_insecure_url != $base_url){
        $servicesFile = 'services.preprod.yml';  
      }
      $settings['container_yamls'][] = $app_root . '/' . $site_path . '/' . $servicesFile; 
    }
}




  • No labels