以前、「WildFlyでJdbcRealm」 という記事を書きました。 これを現在インストールしている9.0.1.Final上で設定したところ、認証がうまく行われないことがわかりました。 大枠の変更はないのですが、DBに登録するパスワードのハッシュ文字列が当時とは異なる値である必要があったので、 忘れないようにメモしておきます。
差分
WildFly 8.0.0.Finalの時の設定:
<security-domain name="app" cache-type="default">
<authentication>
<login-module name="app_auth" code="Database" flag="required">
<module-option name="dsJndiName" value="java:jboss/datasources/ExampleDS"/>
<module-option name="principalsQuery" value="SELECT PASSWORD FROM ACCOUNTS WHERE EMAIL = ?"/>
<module-option name="rolesQuery" value="SELECT r.ROLENAME, 'Roles' FROM ROLES r, ACCOUNTS a WHERE r.ACCOUNTID = a.ACCOUNTID AND a.EMAIL = ?"/>
<module-option name="hashAlgorithm" value="SHA-256"/>
<module-option name="hashEncoding" value="HEX"/>
</login-module>
</authentication>
</security-domain>
WildFly 9.0.1.Finalの設定:
<security-domain name="app" cache-type="default">
<authentication>
<login-module name="app_auth" code="Database" flag="required">
<module-option name="dsJndiName" value="java:jboss/datasources/ExampleDS"/>
<module-option name="principalsQuery" value="SELECT PASSWORD FROM ACCOUNTS WHERE EMAIL = ?"/>
<module-option name="rolesQuery" value="SELECT r.ROLENAME, 'Roles' FROM ROLES r, ACCOUNTS a WHERE r.ACCOUNTID = a.ACCOUNTID AND a.EMAIL = ?"/>
<module-option name="hashAlgorithm" value="SHA-256"/>
<module-option name="hashEncoding" value="base64"/>
</login-module>
</authentication>
</security-domain>
違いは module-option の hashEncoding の値。
8.0.0.Finalの時はHEX
であり、9.0.1.Finalではbase64
にしています。
これはパスワードのハッシュエンコーディングの形式を指定している部分なのですが、
9.0.1.FinalではHEXを認識していない模様。
なので、DBに登録するパスワードのハッシュ文字列も設定に合わせてHEX
からbase64
に変更します。
パスワードのハッシュ文字列生成方法
WildFlyにはbase64
のハッシュ文字列を生成するモジュールが入っているようです。
以下のコマンドで指定文字列のBase64ハッシュ値を取得することができます。
java -cp $JBOSS_HOME/modules/system/layers/base/org/picketbox/main/picketbox-4.9.2.Final.jar org.jboss.security.Base64Encoder [任意文字列] SHA-256