Newsgroup: it.comp.os.linux.sys
Titolo: apache, autenticazione e redirezione

Mi è stata posta 'sta domanda... alla quale non so dare risposta...
Si vorrebbe avere la possibilità di avere un sito interamente statico, 
ma con una serie di directory riservate, il cui accesso è legato a 
username e password. Fin qui nulla di strano.
Quello che vorrebbero è che in funzione delle credenziali fornite, una 
dir. "fake" vada a puntare sulla dir. collegata all'utente in questione.
del tipo: clikko sul link che punta a "
www.ddd.com/fake/
", chiede user e 
password, lo dirigo su 
www.ddd.com/real1
 o real2 o real3, a seconda 
delle credenziali fornite.
sapete di qualche configurazione che permetta di farlo direttamente con 
apache (tipo una combinazione di mod_auth e mod_rewrite, per dire... ma 
la sparo perchè non ho neanche studiato i suddetti, ancora) e conoscete 
qualche link specifico o la sbadilo direttamente ai programmatori e 
gliela faccio fare in cgi?
Byez evribadi!
-- 
Emanuele "SKULL" Balla
-----------------------------------------------------------------------
Besides, I think [Slackware] sounds better than 'Microsoft', don't you?
(By Patrick Volkerding)

 gliela faccio fare in cgi?
Io l'ho fatto in CGI.
Davide

 
Se gli utenti non sono molti, potresti provare ad 
utilizzare mod_rewrite
in httpd.conf:
RewriteEngine On
RewriteCond %{LA-U:REMOTE_USER}  nome_utente1
RewriteRule  /fake /directory_di_utente1  [R]
RewriteCond %{LA-U:REMOTE_USER}  nome_utente2
RewriteRule  /fake /directory_di_utente2  [R]
La directory fake deve richiedere l'autenticazione
(.httpasswd o in httpd.conf)
Ho fatto una prova e sembra funzionare.
Comunque, se decidi di utilizzarla controla meglio
di quanto non abbia fatto io :)
Sembrerebbe funzionare anche in questa forma:
RewriteEngine On
RewriteCond %{LA-U:REMOTE_USER}  nome_utente1
RewriteRule  /fake /%{LA-U:REMOTE_USER}  [R]
In questo caso ti manda nella directory 
nome_utente1
Marco

 nome_utente1
Utilissimo, thanks... mo' mi metto a smazzare... ;-)
Byez


 
Allora (sě, ovviamente son qui e non mi č riuscito ;-)
Ho fatto una compilazione di apache ad-hoc per la prova e ho provato 
entrambe le sintassi da te suggerite.
Ti porto comunque il caso della prima (che non č quella qui sopra... ho 
quotato troppo... :-P )
Ho adottato quanto segue:
<httpd.conf>
DocumentRoot "/opt/apache/htdocs/html"
[...]
RewriteEngine On
RewriteLog "/opt/apache/logs/rewrite.log"
RewriteLogLevel 9
<Directory "/opt/apache/htdocs/html/fake">
    AuthType Basic
    AuthName "Area Riservata"
    AuthUserFile /opt/apache/htdocs/password.dat
    Require user pippo pluto paperino minnie
    RewriteCond %{LA-U:REMOTE_USER}  pippo
    RewriteRule  /fake /pippo [R]
    RewriteCond %{LA-U:REMOTE_USER}  pluto
    RewriteRule  /fake /pippo [R]
    RewriteCond %{LA-U:REMOTE_USER}  paperino
    RewriteRule  /fake /paperino [R]
    RewriteCond %{LA-U:REMOTE_USER}  minnie
    RewriteRule  /fake /minnie [R]
</Directory>
</httpd.conf>
E' solo una conf di prova, sia chiaro.
Se per quanto riguarda l'autenticazione tutto va come dovrebbe, la 
redirezione non avviene, e non capisco perchč (oltre alla mia ignoranza 
sul funzionamento del mod_rewrite, ovvio...).
Se interrogo i logs del mod_rewrite, mi dicono, in effetti, che:
192.168.10.103 - - [...] (2) init rewrite engine with requested uri /fake/
192.168.10.103 - - [...] (1) pass through /fake/
192.168.10.103 - paperino [...] (2) init rewrite engine with requested 
uri /fake/index.html
192.168.10.103 - paperino [...] (1) pass through /fake/index.html
192.168.10.103 - paperino [...] (2) init rewrite engine with requested 
uri /fake/index.html
192.168.10.103 - paperino [...] (1) pass through /fake/index.html
In pratica, direi, a spanne, che il mod_rewrite se ne sbatte... ;-)
La documentazione di mod_rewrite dice che la sintassi LA-U:REMOTE_USER č 
da usarsi per via della posizione delle api del'auth rispetto al punto 
di applicazione del mod_rewrite, e pertanto non sarebbe altrimenti in 
grado di intercettare il REMOTE_USER.
Ciň significa che se la redirezione la faccio in una direttiva 
<Directory> non la devo usare, o valgono le stesse limitazioni, dato 
che, facendo parte del file di configurazione (diversamente 
dall'.htacces) viene comunque parsata in fase di bootstrap di apache?
Idea di dove sia il mio errore?
THX ancora e Byez.


 
Come non detto... se sposto le direttive di rewrite fuori da Directory 
funziona... :-P
E' la prima volta che mi capita di avere a che fare con il 
mod_rewrite... e devo dire che è una figata... cito questa dalla 
documentazione ufficiale, che rende bene l'idea :-)
``The great thing about mod_rewrite is it gives you all the 
configurability and flexibility of Sendmail. The downside to mod_rewrite 
is that it gives you all the configurability and flexibility of Sendmail.''
-- Brian Behlendorf
Apache Group
Significativo, no?
Byez :-)


 mod_rewrite... e devo dire che è una figata... 
Si, piace moltissimo anche a me :)
Ho continuato a leggicchiare e mi e' venuto
in mente che, forse, per evitare la 
definizione di tutti gli utenti potresti provare
la seguente configurazione:
RewriteCond %{LA-U:REMOTE_USER}  .+
RewriteRule  /fake /%{LA-U:REMOTE_USER}  [R]
Che tradotto dovrebbe essere qualcosa del tipo:
SE la variabile REMOTE_USER contiene almeno un 
carattere E l'url contiene /fake ALLORA
ridirigi su directory contenuta in  REMOTE_USER.
Non l'ho provata !!!
un saluto
Marco

 ridirigi su directory contenuta in  REMOTE_USER.
Alla fine ho optato per la presente configurazione, che mi pare quella 
con minori criticità:
<Directory "${VHOST_ROOT}/html/${RESERVE_DIR}">
    AuthType Basic
    AuthName "Area Riservata"
    AuthUserFile ${QUELLO_CHE_E}/password.dat
    Require valid-user
</Directory>
RewriteCond ./%{LA-U:REMOTE_USER} -U
RewriteRule /${RESERVE_DIR} /%{LA-U:REMOTE_USER}  [R]
In pratica:
l'utente non autenticato non va da nessuna parte.
dopo l'autenticazione ok, lo dirigo nella dir con il suo nome, se questa 
esiste. Se invece non esiste, la rewrite non viene effettuata e va 
_effettivamente_ in ${RESERVE_DIR}, dove è possibile mettere una pagina 
di (dis)servizio.
Ovviamente nella dir /%{LA-U:REMOTE_USER} ci sarà un .htaccess che 
permette l'accesso solo all'utente proprietario.
Inoltre ha il vantaggio di essere tutta "out of apache", per cui 
aggiunte/modifiche della configurazione dei singoli utenti, basandosi 
solamente su .htaccess e password.dat, vengono parsate a runtime, senza 
bisogno di inviare un HUP ad apache.
Da qui a fare uno scriptino per l'aggiunta/rimozione di utenti, il passo 
è banale...
Se dovesse tornare utile a qualcuno...
Byez...
-- 
Emanuele Balla aka Skull


 RewriteRule /${RESERVE_DIR} /%{LA-U:REMOTE_USER}  [R]
C'è qualcosa che mi sfugge riguardo al modo in cui la RewriteCond 
interpreta quello che gli passo...
In particolare, mi son detto, la RewriteCond qui sopra dovrebbe, nella 
mia idea, essere qualcosa del tipo
RewriteCond /reserved/%{LA-U:REMOTE_USER} -d
Ovvero: dalla root del webserver (del virtualserver in questo caso ) 
deve esistere la dir. /reserved/$nomeutente.
Banale...
Solo che non matcha.
Mi son detto: forse richiede il path dalla root del filesystem. Ma anche 
così ciccia. Dunque la domanda è: da dove diavolo parte? Oppure, dove è 
l'errore di logica che fa sì che ciò non funzioni?
Mi sai dare qualche hint?


 Mi sai dare qualche hint?
Prova ad abilitare il Log:
RewriteLog /qualche_dir/rewrite.log
RewriteLogLevel 9
A me succede il contrario :)
Premetto che le prove le ho eseguite sul mio portatile
con Apache/1.3.20
Comunque, a me il parametro -U torna sempre "vero".
Ho cercato con google e ho trovato alcuni link
che segnalavano il problema.
Questo e' uno:
http://bugs.apache.org/index.cgi/full/5229
Sei certo che -U funzioni ?
prova a mettergli una dir falsa e guarda cosa
ti restituisce.
Il parametro -d sembra invece riferirsi al path
"reale" non a quello relativo alle definizioni di Apache.
Un saluto
Marco

 "reale" non a quello relativo alle definizioni di Apache.
Avevo immaginato... il problema è che in entrambi i casi mi restituisce 
sempre falso :-P
Approfondisco...
Byez.
