geek.conf.2

あるインフラエンジニアの備忘録

basic認証ディレクトリの下位のbasic認証をパスに対してはずす

タイトル矛盾してます。。
タイトルのとおりはずします。これができたのがびっくりだったので書きます。

私の認識ではbasic認証というかAuthTypeディレクティブは定義したディレクトリ以下に適用され、
はずせないと思っていました。。

環境は
apache2.0.59
/hogeのLocationディレクティブ内にAuthTypeディレクティブ(basic

で、はずしたい下位のパスは

servername/hoge/hoge.do

そうstruts拡張子ですね。

今回、テストサーバの設定ということでこのような意味のないような
ことをやっています。
公開サーバですのでapacheでアクセス制御しているのですが、どうも
このパスには認証ダイアログを出したくないそうです。(もちろんOrderディレクティブで制御します)

そこで下記のように設定しました。


Alias "/hoge" "^/hoge"
<Location /hoge>
AuthType basic
AuthUserFile "^/.htpasswd"
AuthName "秘密"
Require user wingeek
</Location>

<Location /hoge/hoge.do>
Order deny,allow
deny from all
allow from xxx.xxx.xxx.xxx

Satisfy Any

</Location>


ここでSatisfyディレクティブがミソとなります。
このディレクティブがホストレベルの制御(Orderディレクティブ)と
ユーザ認証(AythTypeディレクティブ)を管理してくれます。

Anyと指定することで二つのアクセス制御のうち、どちらかを満たせば
良いということになります。

デフォルトはAll、つまり両方とも満たさなければならないです。

許可したいパスに対してLocationディレクティブで許可するホストを
指定してあげる。
そして、Satisfyディレクティブによってそのホストであるか、あるいはbasic認証
スルーすればアクセス可としています。

下位パスを許可しないホストに認証ダイアログも出したくない場合でしたね。。。

これは調査中です。てか、暫定設定なんで上記のケースは保留となりました。

上位ディレクティブのAuthType Noneを指定し、下位ディレクティブにSatisfy All
をやると一応できますが、

parmission denied 403

はされずに

configuration error: couldn't check user. No user file?: 500

と出ます。。

つまり、Satisfy Allなので下位パスへのアクセスは弾かれ、ユーザ認証へ移ろうとする
のですが、htpasswdファイルがないと言われます。。

ちなみに

AuthUserFile /dev/null

しても同様のエラーが出ます。

てか、AuthType Noneなんてねーよ!

と怒られています。

もちろん、マニュアルにもAuthTypeディレクティブにNoneなんて
構文はありませんww



どなたか上記実現方法を知っていれば是非ご教示ください!