JBossSeamでBasic認証1

2つの方法があります。

断然、前者がお勧めです。
なんといっても、Seam側でBasic認証を組み込むとSeamTestに影響が出るのです(泣

前者のやり方を書いてみます。構成はapache+JBossASと仮定。

apacheからAJP経由でJBossASへ接続し、BASIC認証を掛けます。


ProxyPass ajp://localhost:8009/foo/
AuthType Basic
AuthName "please input id and password"
AuthUserFile /aaa/bbb/.htpasswd
Require user fooUser


mod_proxy_ajpだとこんな設定(httpd.conf)です。
(mod_proxy_ajpmod_jkの使い分けは、apache2.2系なら通常mod_proxy_ajp、apache2.0系等やmod_jkの機能が必要ならmod_jk1.2系といった感じのようです。でもRedHat/JBossが商用サポートとして推奨しているのはmod_jk1.2系。)

SSLを使用する場合、ブラウザ-apache間でSSL通信、apache-JBossAS間は8009ポートを使用した通常のAJPとするのが普通です。


次に受け側、JBossAS内部のtomcatの設定。
JBossApplicationServer5.0および5.1では、以下の場所にserver.xmlがあります。
server/設定セット名/deploy/jbossweb.sar/server.xml
ここでAJP用のConnectorの設定を変更します。

「tomcatAuthentication="false"」を追加すると、wwwサーバ側の認証情報が伝わってきます。


SeamアプリケーションでのBASIC認証ユーザ名の取得は以下のようにします。

ExternalContext exCtx = facesContext.getExternalContext();
String user = exCtx.getRemoteUser();
if (null == user) {
//apache側でBASIC認証したユーザをSeam経由だと上手く取れないので
//下記の方法で取得する.
ServletRequestWrapper wrapper = (ServletRequestWrapper) exCtx.getRequest();
HttpServletRequest request = (HttpServletRequest) wrapper.getRequest();
user = request.getRemoteUser();
}


見ずらいですが、要は

facesContext.getExternalContext().getRemoteUser()

では取得できなくて、

facesContext.getExternalContext().getRequest().getRequest().getRemoteUser()

で取得できるということです。

BASIC認証を使っていない場合(wwwサーバ経由でなくアクセスした場合など)、userがnullになります。