Domanda

Sfondo

Ho un / 2.2.15 (Win32) con PHP / 5.3.2 istituito, l'autenticazione gestione Apache.

<Directory /usr/www/myhost/private>
  # core authentication and mod_auth_basic configuration
  # for mod_authn_dbd
  AuthType Basic
  AuthName "My Server"
  AuthBasicProvider dbd

  # core authorization configuration
  Require valid-user

  # mod_authn_dbd SQL query to authenticate a user
  AuthDBDUserPWQuery "SELECT Password,UserName,Realm,Access FROM authn WHERE user = %s"
</Directory>

L'autenticazione funziona benissimo! Nessun problema.

Ma per quanto riguarda la documentazione , qualsiasi campo in più tornato indietro dalla l'AuthDBDUserPWQuery sarà messo in un AUTHENTICATION_fieldname variabile nell'ambiente.

Con phpinfo(), posso vedere queste variabili con lui valori corretti sotto "Apache ambiente".

AUTHENTICATE_USERNAME
AUTHENTICATE_REALM
AUTHENTICATE_ACCESS

Problema

Non è possibile recuperare le variabili d'ambiente dal mio php.

1 <?php
2   $Access = apache_getenv('AUTHENTICATE_ACCESS',true);
3   var_dump($Access);
4 ?>

Linea 3 stampe bool (false) che indica che non è stata trovata la variabile!
Tuttavia se cambio ad un'altra variabile Apache ambiente come ad esempio 'HTTP_HOST' funziona.
..e sì, ho provato anche getenv(), stesso risultato.

C'è anche una nota che il server Apache deve essere compilato con aprile 1.3.0 al lavoro. Ho usato la build Apache msi da httpd.apache.org e sembra essere compilato con aprile sopra la versione 2. Dato che io li vedo con phpinfo() devono essere accessibili da PHP.

È stato utile?

Soluzione 2

Ho fatto un lavoro in giro,

Sembra che questo potrebbe essere un bug di PHP. Trovato alcuni bug relativi riportati per PHP 4 e forse non li hanno ancora fissato ...

Ho fatto una soluzione che io davvero non mi piace (perché sto accede alla tabella datiutente Apache), ma sembra che non ho scelta.

//************************************************************* 
// If PHP failed to retrieve the AuthDBDUserPWQuery fields.
// Connect to Apache authentication databaseand create the
// envirnment variables manually
//
if (empty($_ENV['AUTHENTICATE_ACCESS'])) {
  $Apache = mysql_connect('MyServerIP','MyUserName','MyPassword',false,MYSQL_CLIENT_SSL|MYSQL_CLIENT_COMPRESS);
  mysql_select_db('MyDatabase',$Apache);
  $SQLSet = mysql_query("SELECT Realm, Access FROM authenticationtable WHERE UserName='".$_SERVER['PHP_AUTH_USER']."' AND Password='".$_SERVER['PHP_AUTH_PW']."'");
  $SQLRow = mysql_fetch_array($SQLSet);
  $_ENV['AUTHENTICATE_REALM'] = $SQLRow['Realm'];
  $_ENV['AUTHENTICATE_ACCESS']= $SQLRow['Access'];
  mysql_close($Apache);
}

Se il PHP non è riuscito ad aggiornare $ _ENV corretta, questo recupererà l'attuale utente connesso dallo stesso database e la tabella che Apache sta usando per l'autenticazione. Poi i campi aggiuntivi verranno scritti nella variabile globale $ _ENV in modo che possa essere utilizzato come dovrebbe. Più tardi, quando il "bug" è fisso, utilizzerà automaticamente il $ _ENV originale.

Se chiunque può portare un po 'informazioni aggiornate su questo argomento, sarei felice ...

Altri suggerimenti

Ho usato questa regola mod_rewrite in un file .htaccess per rendere la variabile d'ambiente intestazione HTTP Autorizzazione disponibile in $_SERVER['HTTP_AUTHORIZATION']. Sono sicuro che questo potrebbe essere adattato per i vostri scopi. Non so se è la soluzione migliore, ma è a Soluzione:

RewriteRule .* - [env=HTTP_AUTHORIZATION:%{HTTP:Authorization},last]

C'è un indizio in risposta di deceze. Egli è il recupero dei dati da $ _SERVER invece di $ _ENV.

stavo installando un Apache Env Var con

SenEnv my_var "true" nel httpd.conf principale e non poteva vederlo in $ _ENV. E 'stato in $ _SERVER però.

Recentemente ho scritto una libreria per ottenere i valori di variabili di ambiente e parse ai tipi di dati PHP. Questa libreria può essere utilizzata per le variabili di ambiente di parsing di tipi di dati PHP (come la colata di integer, float, null, boolean), analizzare le complesse strutture di dati come una stringa JSON e più con il contributo della vasta community.

La libreria è disponibile qui: https://github.com/jpcercal/environment

Imposta le variabili d'ambiente con .htaccess per esempio:

SetEnv YOUR_ENV_VARIABLE_NAME the-value-of-your-env-var

E per ottenere i valori dalla variabile d'ambiente (indipendentemente dalla CLI dell'ambiente, Apache, Nginx, PHP built-in server e più) per farlo:

<?php
// ...
require "vendor/autoload.php";
// ...
var_dump(Cekurte\Environment\Environment::get("YOUR_ENV_VARIABLE_NAME"));

Buon divertimento.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top