【Java】JSF + tomcat + mysql + jdbcRealmでログイン


返せ!僕の3連休!
ええ。
文字通りこれの認証に躓いてしまい3連休がものの見事に消し飛びました…。

なので今日はtomcatとmysqlを使ってログイン機能を作る時に僕が躓いたことでもまとめておきたいと思います。

備忘録として書きますが、
絶対これ僕意外にも躓く人いるんじゃないかな?笑



環境
【sakura vps】
mysql Ver 14.14 Distrib 5.6.27
Apache Tomcat/8.0.27
jsf 2.2
CentOS 6.7

【ローカル(MacBookAir)】
mysql Ver 14.14 Distrib 5.6.27
Apache Tomcat/8.0.27
jsf 2.2
OS X 10.9.5
※eclipse jeeluna


ローカル環境設定手順
なにより僕が一番躓いたのがここでした。
mysqlとtomcatが既に入っている前提で書いて行きます。

ちょこっとググると沢山の記事が出てくるようにJDBCRealmでログインの認証をするためにはweb.xmlとserver.xmlをいじくる必要があります。そしてここが一番の難関でもあるのでしっかりとpathの確認をしないと僕みたいになるわけであります。

早速vimでserver.xmlを編集していきます。

【server.xml / Before】

<!-- Use the LockOutRealm to prevent attempts to guess user passwords
           via a brute-force attack -->
      <Realm className="org.apache.catalina.realm.LockOutRealm">
        <!-- This Realm uses the UserDatabase configured in the global JNDI
             resources under the key "UserDatabase".  Any edits
             that are performed against this UserDatabase are immediately
             available for use by the Realm.  -->
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>
      </Realm>

【server.xml / After】

<!-- Use the LockOutRealm to prevent attempts to guess user passwords
           via a brute-force attack -->
      <!-- <Realm className="org.apache.catalina.realm.LockOutRealm"> -->
        <!-- This Realm uses the UserDatabase configured in the global JNDI
             resources under the key "UserDatabase".  Any edits
             that are performed against this UserDatabase are immediately
             available for use by the Realm.  -->

      <Realm className="org.apache.catalina.realm.JDBCRealm" debug="99"
        driverName="com.mysql.jdbc.Driver"
        connectionURL="jdbc:mysql://localhost/データベス名だよ"
        connectionName="ユーザー名だよ" connectionPassword="パスワードだよ"
        userTable="ユーザー情報のテーブル名だよ" userNameCol="ユーザー名カラムだよ" userCredCol="パスワードのカラムだよ" 
        userRoleTable="ユーザーロールのテーブル名だよ" roleNameCol="ユーザーロールのカラムだよ" />

        <!--    
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
               resourceName="UserDatabase"/>
        -->
      <!--</Realm> -->

ってな感じで編集するわけです。
そんでもって今度はeclipseで‘/プロジェクト/WebContent/WEB-INF/web.xml’を編集していきます。

<security-constraint>
		<web-resource-collection>
			<web-resource-name>JDBCRealm</web-resource-name>
			<url-pattern>/content/*</url-pattern>
		</web-resource-collection>
		<auth-constraint>
			<role-name>admin</role-name>
		</auth-constraint>
	</security-constraint>

	<!-- <login-config> <auth-method>BASIC</auth-method> <realm-name>JDBCRealm</realm-name> 
		</login-config> -->
	<login-config>
		<auth-method>FORM</auth-method>
		<realm-name>JDBCRealm</realm-name>
		<form-login-config>
			<form-login-page>/ログインページのurlだよ.html</form-login-page>
			<form-error-page>/エラーページのurlだよ.html</form-error-page>
		</form-login-config>
	</login-config>
	<security-role>
		<role-name>admin</role-name>
	</security-role>

これでさくさく動くはずなのですが僕はこいつが動作せず3日間苦労しました。

データベースも繋がっているし
ログインページも表示されるし
エラーログみても何にもエラーが出ていないのに

何故かログインが出来なかったのです。

原因は至極シンプルでした…。
ローカルで‘ps aux | grep catalina’と叩いてみてください。

そうなんです。
僕は$CATALINA_BASEの中にあるserver.xmlではなく、
$CATALINA_HOMEの中にあるserver.xmlを編集していました…。

これは繋がるはずもありません…。

そしてもう1つ落とし穴が!!!
この$CATALINA_BASEの中にある方のserver.xmlちゃん。
何故か何度編集してもtomcatの都合で勝手に初期化されていました…。

そりゃ何度編集しても動くはずがありません…。

原因を究明するのもダルかったので(vps上では同様のエラーが見られなかったので)現状は放置しております。ローカル環境でのみ、実装したものをテストするときにさくさくっとserver.xmlを書き換えてログインしております。

※vpsでは$CATALINA_HOMEと$CATALINA_BASEのpathが同じでした。


まとめ
3連休こんなくだらないミスで消えたかと思うと悲し過ぎますが、今回これだけ盛大にミスったのでもうやらないでしょう…。

最後に。
色々便利な備忘録も増えておりますが、困った時は本家のページが一番でした…。

参考:https://tomcat.apache.org/tomcat-7.0-doc/realm-howto.html#JDBCRealm

相も変わらずキモい猫を見なければいけないのがネックですが、
キモい猫を見るだけでさくっとサーブレットが動くならば安いものです…。

スクリーンショット 2015-10-12 19.23.33


おまけ
ログアウトを実装しないうちにログインが出来るようになって
喜んで色んな端末で試したらセッションが破棄出来ず大変なことになりました。笑


最後まで読んでいただきありがとうございます。もしこの記事を気に入って頂けたようであればシェアをお願い致します。非常に励みになります。


コメントを残す