2013-02-01 22 views
10

Ho un server Apache in cui è richiesta l'autenticazione, ma ci sono alcune chiamate che devono essere consentite per tutti.Autorizzazioni Apache basate su querystring

on off queste chiamate si basa su una stringa di query, ad esempio:

/foo/api.php?Token=123 & task = DoStuff & Risultato = json

ho insegnato che con un LocationMatch che avrebbe funzionato così ho risolto questa configurazione:

<LocationMatch ^/foo/api.php\?.*(Task=DoStuff).*> 
    Order Allow,Deny 
    Allow from All 
</LocationMatch> 

Ma questo non mi lascia passare il autenticazione (nel senso che ottengo un 401). Se ho appena filtrato ^/foo/api.php ho passato l'autenticazione, ma questo non è abbastanza severo.

Qualcuno ha qualche idea su come configurarlo per verificare il parametro Task nella querystring?

Per l'autenticazione che stiamo utilizzando Kerberos, questo è costretto su tutto il sito Questa è la nostra conf per frenare

LoadModule auth_kerb_module modules/mod_auth_kerb.so 

<Directory /var/www/html> 
    Options FollowSymLinks 
    AllowOverride All 
    AuthType Kerberos 
    Require valid-user 
    AuthName "Kerberos Login" 
    KrbMethodNegotiate on 
    KrbMethodK5Passwd on 
    KrbAuthRealms FOO.LOCAL 
    KrbServiceName HTTP/[email protected] 
    Krb5KeyTab /etc/httpd/conf/http.keytab 
    Satisfy Any 
    Order deny,allow 
    Deny from all 
    Allow from 192.168.72.90 
    Allow from 192.168.72.91 
    Allow from 192.168.72.94 
    Allow from 192.168.72.95 
    Allow from 127.0.0.1 
</Directory> 

risposta

10

Come si può leggere here:

Il < Località >, <LocationMatch>, <Directory> e <DirectoryMatch> Le direttive Apache ci consentono di applicare l'autenticazione/autorizzazione ai modelli specifici di risorse con un alto grado di specificità, ma non ci danno quel controllo fino al livello di stringa di query.

Pertanto, è necessario utilizzare mod_rewrite per raggiungere l'obiettivo.
Per esempio:

RewriteEngine on 
RewriteCond %{QUERY_STRING} Task=DoStuff 
RewriteRule ^/foo/api.php - [E=no_auth_required:1] 

<LocationMatch ^/foo/api.php> 
     Order allow,deny 
     Allow from env=no_auth_required 
     AuthType Basic 
     AuthName "Login Required" 
     AuthUserFile /var/www/foo/.htpasswd 
     require valid-user 
     Satisfy Any 
</LocationMatch> 

UPDATE

quali hai dichiarato che:

Se ho appena filtrare ^/pippo/api.php vengo superato l'autenticazione, ma questo non è abbastanza severo.

Poi, prova ad aggiungere le seguenti righe alla configurazione:

RewriteEngine on 
RewriteCond %{QUERY_STRING} Task=DoStuff 
RewriteRule ^/foo/api.php - [E=no_auth_required:1] 

<LocationMatch ^/foo/api.php> 
     Order allow,deny 
     Allow from env=no_auth_required 
</LocationMatch> 
+0

guarderò in questo, avrei dovuto aggiungere che stiamo utilizzando auth_kerb per l'autenticazione, il problema ora che sto avendo è che sta facendo auth_kerb prima e poi mod_rewrite – Frederiek

+0

@Frederiek è la direttiva 'AuthType Kerberos' nel tuo file di configurazione di apache all'interno o all'esterno della sezione' LocationMatch'? Puoi eventualmente fornire ulteriori dettagli sulla configurazione che stai utilizzando? Forse [questa risposta] (http://serverfault.com/questions/404149/how-can-i-disable-kerberos-authentication-for-only-the-root-of-my-site) potrebbe anche essere utile. –

+0

Vedi modifica nella domanda originale. ho incluso il file conf – Frederiek

1

C'è un modo più semplice per fare questo senza la riscrittura.

È possibile utilizzare LocationMatch per abbinare fino alla QUERY_STRING, e quindi utilizzare un blocco If per abbinare il contenuto di QUERY_STRING. cioè, Qualcosa di simile:

<LocationMatch "^/foo/api.php"> 
    <If "%{QUERY_STRING} =~ /.*Task=DoStuff.*/" > 
     Order Allow,Deny 
     Allow from All 
    </If> 
</LocationMatch> 
+0

'' è una funzionalità di apache 2.4 e 'Order' /' Allow' sono funzioni di apache 2.2. Questo potrebbe funzionare se si utilizza la sintassi Require invece, ma solo su 2.4. – noobish

Problemi correlati