tomcatとDBを連携してユーザー認証
tomcatの機能としてDBと連携してユーザー認証機能を実現できますが、なかなか記事がなかったので、まとめておきます。tomcatのバージョンによっても結構違うっぽい。
DBとの連携(JDBC vs DataSource)
tomcat上でDBと接続するためには、設定ファイル(server.xmlやcontext.xml)に接続情報を記述する必要がありますが、JDBCかDataSourceの2種類のRealmで記述できます。
以下の投稿にあるように、JDBCでは処理コストが高いからDataSourceの方がよいそうです。
https://stackoverflow.com/questions/35732482/what-is-the-difference-between-jdbcrealm-and-datasourcerealm
digestパスワード
DBにIDとパスワードを格納しますが、平文で格納するよりは何らかの形で暗号化をしたいところです。
<Realm className="org.apache.catalina.realm.DataSourceRealm"
debug="99"
dataSourceName="jdbc/postgres" userTable="usr_auth" userNameCol="usr"
userCredCol="pass" userRoleTable="auth_role" roleNameCol="usr_role"
localDataSource="true">
<CredentialHandler className="org.apache.catalina.realm.MessageDigestCredentialHandler" algorithm="MD5" />
</Realm>
のように<CredentialHandler>
によってdigest化するアルゴリズムを指定できます。
ここでパスワードのエンコード方法ですが、
$CATALINA_HOME/bin/digest.(sh|bat)
が用意されているので、コレを利用してエンコードをします。その際ユーザーIDとweb.xmlの
<login-config>
で指定している<realm-name>
の値を用いて
$CATALINA_HOME/bin/digest.sh -a MD5 -s 0 usr:realm:password
のようにしてエンコードしたパスワードを生成します。
公式には、認証方式がdigestで、格納パスワードもdigest化したい場合は、
MD5のsaltなしでないとできないように書かれています。