たかがレルムされどレルム GlassFish で始める詳細 JDBC レルム
2013年12月10日 at 2:20 午前 17件のコメント
この記事は「 GlassFish Advent Calendar 2013」 の10日目として新たに書き下ろしたものです。昨日は蓮沼さんによる「GlassFish付属のJava DBについて」でした。
幸運にも、昨日 12/09 に蓮沼さんが GlassFish に付属している Java DB について詳しくご紹介してくださったので、今日はその流れ?!というわけではありませんが、GlassFish に付属の Java DB(他のDBにも利用できます) を使用して、Java EE 標準の認証・認可方法をご紹介します。
Realm (レルム) は古くから Java 標準の認証・認可を行なうための機能として多くの環境で利用されてきましたが、やや環境構築や設定が大変という事もあって、レルムを使用せず独自の認証システムを構築される事もいらっしゃるようです。しかし、Java EE コンテナが提供する認証・認可機能を正しく理解し設定やプログラミングを行なえば、より安全で柔軟なプログラムを簡単に実現できるようになります。
また、この認証・認可の機能は Java EE に含まれるフレーム・ワーク全体に対して適用が可能なため、今回の資料では動作確認に JavaServer Faces を利用してを行ないますが、JSFに限らず、JAX-RS でも EJB でも、その他のフレームワークでも全ての Java EE フレームワークに適用できますのでとても重要です。
非常に古くからある機能のため、既にご存知の方やご適用頂いている方も多いかと思いますが、「たかがレルムされどレルム」で Java EE の中でも重要な概念の一つと考えています。最近、Java EE を始めた方や、これから Java EE を始める方に、本ブログ・エントリが有用な情報になれば誠に幸いです。Web アプリケーションに対してどこからどのように認証・認可などの設定を進めればよいか分からない方はどうぞご覧ください。
本ブログエントリは、環境構築手順をできるだけ詳細にご紹介し、これさえ見れば JDBC レルムの環境構築がある程度できるという資料になるようにエントリを書いてみました。当初はブログのエントリ中に JDBC レルムに関する説明を書こうと考えましたが、非常に長い内容になりましたので、途中でブログで記載するのはあきらめ PDF で資料を作りなおしました。PDF であればダウンロードしプリント・アウトした後にゆっくりご確認頂けるので、よりよいかと想定しています。是非、本資料を有効活用をして頂ければ幸いです。
限られた時間の中で急ピッチで作成しましたので、手順を端折って実装した所もあります(例えばユーザ登録、削除の確認画面など)。しかし、全体的な設定手順や実装方法の概要は掴めるかと思いますので、ご参考ください。
本資料でご紹介したコードは下記にアップしております。コードだけを参照されたい場合は、下記へアクセスしてください。
https://github.com/yoshioterada/JDBC-Realm-Sample
※ 下記に公開する PDF 資料中のプロジェクト名、パッケージ名は適切ではありません。プロジェクト名、パッケージ名等は適宜ご修正ください。元々、次のブログ・エントリで記載する内容とマージして一つの資料としてまとめたかったのですが、時間の関係上とボリュームの関係で、本 PDF には JDBC レルムの部分までしか記載できませんでした。
そこで、JDBC Realm のハンズオン・ラボの資料としてはプロジェクト名、パッケージ名などが適切ではない名前が記載されています。上記 GitHub ではプロジェクト名、パッケージ名をリファクタリングした後のコードをアップしておりますので、併せてご参照ください。
最後に、認証や認可用の設定やコードを行なうと、jUnit 等のテスト連携が困難になると予想される方もいらっしゃるかもしれません。
EJB を実装されている場合には jUnit 等の単体テストで、組み込み可能 EJB コンテナを利用できます。
この組み込み可能な EJB コンテナで認証・認可まで含めたテストケースを実施したい場合、GlassFish では下記のクラスを利用する事で、EJB プログラムに対するログイン認証・認可の権限チェックを行なうことができるようになります。
GlassFish v3.x の場合:
$GLASSFISH_HOME\glassfish\modules
com.sun.appserv.security.ProgrammaticLogin
GlassFish v4.0 の場合 (パッケージ名が代わりました。)
$GLASSFISH_HOME\glassfish\modules\security-ee.jar
com.sun.enterprise.security.ee.auth.login.ProgrammaticLogin
例えば、jUnit のコード中で下記のようなコードを書く事ができます。
char[] passwd = “password”.toCharArray();
ProgrammaticLogin progLogin = new ProgrammaticLogin();
progLogin.login(“admin”, passwd , “jdbc-realm”, true);
最後に、今回は DBを使用しましたが、LDAPでも、SSO を実現するような製品群でもレルムは利用可能です。また少ない設定変更でレルムの切り替えももできますので、是非レルムをご理解いただきご利用ください。
Entry filed under: 未分類.
1.
JSF + WebSocket で実装した IMAP Web メール・クライアント | 寺田 佳央 - Yoshio Terada | 2013年12月11日 2:56 午前
[…] たかがレルムされどレルム GlassFish で始める詳細 JDBC レルム […]
2. メソッドバリデーションのユニットテスト | nagaseyasuhito Daily works. | 2013年12月12日 7:35 午前
[…] この記事はJavaEE Advent Calendar 2013の12日目として書かれたものです。昨日は@yoshioteradaの「たかがレルムされどレルム GlassFish で始める詳細 JDBC レルム」でした。 […]
3.
川場隆 | 2014年1月1日 12:48 午後
JavaEE7の本を書いています。ここで公開されているSHA256Encoder.javaを書籍の中で使用させていただいてもかまいませんか?
4.
Yoshio Terada | 2014年1月7日 2:27 午後
川場さん、はい、特に問題はございません。
ちなみに、Java EE 7 の本はいつ頃に御出版予定で書いて頂いているのでしょうか?
もしよろしければ、教えていただく事はできませんでしょうか?
5.
川場隆 | 2014年1月7日 11:16 午後
許諾していただきありがとうございます。
このブログの解説も大変参考になりました。
あわせてお礼を申し上げます。
本は「わかりやすいJava/サーバーサイド編(仮)」として8月に出版予定です。入門編、オブジェクト指向編に続く最後のパートです。初心者でもわかりやすく、そして研修のテキストにできるようなスタンダードな内容です。
6.
Yoshio Terada | 2014年1月9日 3:51 午後
川場さん、ありがとうございます。
サーバサイド編ですが、JSP/Servlet/Struts 等の古い技術の情報は極力情報を
少なくして頂き(無くてもいい)、今の Java EE 6/7 に含まれる JSF 2.x や
JAX-RS 等の Java EE の最新技術の情報を豊富に取り入れて頂く事を節に希望致します。
どうぞご検討の程宜しくお願いします。
7.
川場隆 | 2014年1月10日 6:09 午前
寺田さま、大丈夫です。
目次の概要は次のようです。
01.JavaEEとは
02.NetBeansの使い方
03.JavaEEひとめぐり
04.フレームワークとしてのJSF
05.JSFの機能
06.ビジネスロジックとEJB
07.CDI(コンテキストと依存性注入)
08.JPAによるデータベース処理
09.RESTful WEBサービス
10.WEBソケット
11.Primefaces
12.ウェブアプリケーション作成演習
すでに大部分は一度書き下ろしていて、それをリライトして
本にします。原稿は4月には完成する予定です。
初心者(オブジェクト指向を理解したばかり)にも
わるようにこ解説するのが大きな目的なので目次等の見せ方は
上記から変わりますが、内容はごくスタンダードなJavaEE7です。
8. java ee でユーザー認証をderbyを使って行ってみる | 検証メモ | 2014年5月21日 4:20 午後
[…] 「たかがレルムされどレルム GlassFish で始める詳細 JDBC レルム | 寺田 佳央 &…」 […]
9.
Hiroshi Koide (@hirosk) | 2014年8月14日 12:59 午後
どうしてもうまくいかないので,いまさらですが質問させてください.GlassFish v4, JDK1.8 で試しているのですが,どうしても認証が通らず IndexPage.java の request.login でエラーになります.サーバのメッセージで気になるのは下記の通りです.何かアドバイスをいただけるとうれしいです.
…
Info: WebSocket-Mailer2 was successfully deployed in 2,201 milliseconds.
Info: JACC Policy Provider: Failed Permission Check, context(WebSocket-Mailer2/WebSocket-Mailer2)- permission((“javax.security.jacc.WebUserDataPermission” “/faces/login/index.xhtml” “GET”))
Severe: SEC1112: Cannot validate user [admin] for JDBC realm.
Warning: WEB9102: Web Login Failed: com.sun.enterprise.security.auth.login.common.LoginException: Login failed: Security Exception
10.
Hiroshi Koide (@hirosk) | 2014年8月14日 1:55 午後
すみません.やっと解決できました.私も1つ前のコメントの KEISUKE YAMADA さんと似た状況でうまく行きませんでした.あたらしくエンティティを作り直して,JNDI を指定し直せばうまくいきました.ただ「ドライバクラスうんぬん」と言ったエラーは出なかったので解決出来なかったです.ユーザの登録と削除はできて認証だけ出来なかったので分かりにくいですね.
11. JavaEE6を使ってみる#16‐ユーザ認証できましたけど躓いてます | | 2014年9月30日 6:11 午後
[…] (https://yoshio3.com/2013/12/10/glassfish-jdbc-realm-detail/) を元に 1 […]
12. JavaEE6を使ってみる#16‐認証で躓いてます | | 2014年10月1日 8:54 午前
[…] (https://yoshio3.com/2013/12/10/glassfish-jdbc-realm-detail/) を元に 1 […]
13.
川場隆 | 2014年10月23日 10:38 午前
3カ月もおくれてしまいましたが、「わかりやすいJavaEE」が来月13日に書店向けに出荷予定となりました。
つきましては、完成した書籍を献本させていただきたいのですが、どちらにお送りしたらよろしいでしょうか。よろしければ、下記宛てにご返信をお願いいたします。
川場隆
t.kawaba@gmail.com
14.
nokku | 2014年11月19日 11:26 午前
質問させてください。
JDBCレルム実装前の段階(P59の段階)で実行してregist.xhtmlやremobe.xhtmlを開くと以下のような警告がでます。
「警告: JSF1015: 要求パス ‘/faces/index.xhtml’ の先頭に、FacesServlet プレフィックスパスマッピング ‘/faces’ が 1 つ以上あります。」
これは何の警告でしょうか?
解決策をご存知でしたら教えて頂きたいです。
NetBeansIDE8.0.1
GrassFish 4.1
で実施してます。
15.
toru | 2015年5月13日 3:43 午後
質問があります。スライドではパスワードをSHA-256で1回だけハッシュしていますが、これにSALTを付加したりストレッチングするにはどうすればいいのでしょうか?GlassFish依存でも良いですけど、できれば依存しない方法があればより望ましいです。その他の条件としては、JavaEE7以降です。
16.
Yoshio Terada | 2015年5月13日 3:52 午後
Java EE 8 がリリースされるまでユーザ管理用のAPIが標準化されていないため、
アプリケーション・サーバ毎に独自実装して頂く必要があります。
GlassFish で Salted Hash にするためには、下記のような方法で実施して頂く必要があります。
http://blog.eisele.net/2012/07/glassfish-jdbc-security-with-salted.html
どうぞ宜しくお願いします。
17.
toru | 2015年5月14日 8:37 午後
なんとか実現できました。
http://d.hatena.ne.jp/backpaper0/20121214/1355497214 も参考になりました。
ご多忙な中、ありがとうございました。