竹形誠司 ブログ
ご質問    »トピック一覧
掲示板へのスパムが多いため、「ご質問」のコーナーはユーザー登録制とさせていただきました。お手数ですが、上の「新規ユーザーの登録」メニューより登録をお願いします。
帳票Web
アプリケーション

受注開発始めました
詳しくは こちら
竹形 誠司 著/ラトルズ刊
JSP帳票アプリケーション実践開発入門
JSP帳票アプリケーション
実践開発入門

JSP業務アプリケーション短期開発入門
JSP業務アプリケーション
短期開発入門

Java+MySQL+Tomcatで始めるWebアプリケーション構築入門
Java+MySQL+Tomcatで始めるWebアプリケーション構築入門

Java+MySQL+Tomcatで作る掲示板とブログ
Java+MySQL+Tomcatで作る
掲示板とブログ
登録した人だけに書き込ませられる掲示板にしたい場合は・・?
by rapuntuleru[rapuntuleru]
「Java+MySQL+Tomcatで作る掲示板とブログ」で勉強している者ですが、「2.19ユーザ登録」でログインやユーザ登録は設計できたのですが、このままだとユーザ登録しなくてもアドレスが分かっていれば掲示板にアクセスできてしまうと思うのですが、ユーザ登録した人だけに書き込ませられるようにしたいのですがこの本に書かれたいることで実現できるでしょうか?(既にやり方が明示されていて、私が見逃しているだけでしたらすみません)

よろしくお願いします。
投稿:rapuntuleru[rapuntuleru]/2007年 04月 04日 10時 32分 /更新:2007年 04月 04日 10時 32分
Re:登録した人だけに書き込ませられる掲示板にしたい場合は…?
by KILROY[KILROY]
つ「 2.21 非登録ユーザの利用制限」(pp.195〜198)
 ただし、この手は JSP ファイルでのみ使用可。リンクされている画像や PDF などのファイルに関しては使えないので、制限したいファイルが入っているディレクトリに対してフォーム認証(または BASIC 認証とか DIGEST 認証とか)をかけるという方法で対処する。
 フォーム認証および BASIC 認証については旧著『始めるサーバアプリケーション開発入門』の「4.11 ユーザ認証」(pp.241〜246)または『始める Web アプリケーション構築入門』の「6.12 ユーザ認証」(pp.397〜401)に記述あり。
 なお、すでに大雑把に実装したものはあるのだが、
通常のページにアクセスされた場合、ログインの操作を行なった後に、元の JSP ページに戻す。エラーのときは、エラー表示後、トップページに飛ばす。
入会手続きの途中のページのような、「アクセスの先が一連の流れの中以外でアクセスされてはいけないページ」である場合は、ログイン後にはアクセスされた元のページではなく、トップページに飛ばす。エラーのときは、同じくエラー表示後、トップページに飛ばす。
画像/ PDF /バイナリなど、直接にアクセスがかかったときは、認証後に参照を許す。エラーのときは、別に用意したエラーページに飛ばす。
とかいった細かいケアの部分を詰めていないので、公開はしばらくお待ちください。「ログインの操作を行なった後に、『アクセスの先が一連の流れの中以外でアクセスされてはいけないページ』にアクセスされた場合」とかいったところまで考えると、けっこう面倒臭いのである。

追記:
> (既にやり方が明示されていて、私が見逃しているだけでしたらすみません)
 いや、「これだと登録していない人でも URL が分っていたら読み書きできてしまうのではないだろうか?→それを防止するにはこうすればいい」という構成の流れに素直に乗っている点でナイスなツッコミである。さらに「じゃあ JSP 以外のファイルでは?」という『掲示板とブログ』で割愛された部分の紹介ができ、結果『始める Web アプリケーション構築入門』の宣伝もできるという意味で二重にナイスである。(-_^)b~*
投稿:KILROY[KILROY]/2007年 04月 04日 11時 09分 /更新:2007年 04月 04日 14時 15分
RE:登録した人だけに書き込ませられる掲示板にしたい場合は・・?
by 竹形 誠司[takegata]
あうー、厳しい所を突っ込みますねー!

「動的に生成するページにはアクセスコントロールがかかるが、画像など静的なデータはURLを直接叩くと見えてしまう」という問題は、mixiなどのSNSでちょっと問題になったことがありますね。

対処方法としては、KILROYさんの紹介されているBASIC認証等を使う方法がありますが、アプリケーションユーザとTomcatユーザを二重に管理しなければならず、なかなか一筋縄ではいかないような感じです。

画像やバイナリを直接のURLでは参照できない場所にアップロードして、これらを転送するサーブレットを書き、そのサーブレットにアクセスコントロールをさせるという方法を試してみましたが(実はこのブログには既に実装されています)だいぶオーバーヘッドが大きいので、どうしたもんかなー、という所で止まっています。

このブログのコードも公開する意志はあるのですが、えー、そのうち整理します。なんだか中途半端ですみません。
投稿:竹形 誠司[takegata]/2007年 04月 05日 01時 11分 /更新:2007年 04月 05日 01時 11分
RE:登録した人だけに書き込ませられる掲示板にしたい場合は・・?
by rapuntuleru[rapuntuleru]
回答ありがとうございます!
なるほど。『始める Web アプリケーション構築入門』の方も見てみようと思います。
投稿:rapuntuleru[rapuntuleru]/2007年 04月 05日 04時 44分 /更新:2007年 04月 05日 04時 44分
Re^3:登録した人だけに書き込ませられる掲示板にしたい場合は・・?
by KILROY[KILROY]
> 細かいケアの部分を詰めていないので、公開はしばらくお待ちください。
 「お待たせしました」と言いたいところなのだけど、いましばらくお待ちください。
 Tomcat の機能のひとつに、データベースを用いた自動認証機構があります。これは CATALINA/conf/server.xml の
      <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
            resourceName="UserDatabase"/>
の部分をコメントアウトし、
      <Realm  className="org.apache.catalina.realm.JDBCRealm"
            driverName="org.gjt.mm.mysql.Driver"
          connectionURL="jdbc:mysql://localhost/authority"
        connectionName="test" connectionPassword="test"
              userTable="users" userNameCol="user_name" userCredCol="user_pass"
          userRoleTable="user_roles" roleNameCol="role_name" />
の部分を生かすことで利用できるようになるのですが、この中の「driverName="org.gjt.mm.mysql.Driver"」の部分がこのままで問題ないのか、とかいった部分を詰めきれていないので、もうちょっと時間を頂きたいと思います。なお、現状はこんな感じ。
      <Realm  className="org.apache.catalina.realm.JDBCRealm"
            driverName="com.mysql.jdbc.Driver"
          connectionURL="jdbc:mysql://localhost/authority"
        connectionName="root" connectionPassword="KILROY"
              userTable="users" userNameCol="user_name" userCredCol="user_pass"
          userRoleTable="user_roles" roleNameCol="role_name" />
 これ以外に、実際のデータベースの作成とテーブルへのユーザ情報のセットとか( authority データベースを作成して、 users テーブルと user_roles テーブルを作ってデータを格納しなければなりません)CATALINA/conf/catalina/localhost/ の下のアプリケーション固有の .xml の修正(データベースが見えるようにしなければいけません)とか、アプリケーション配下の web.xml へのレルムおよびセキュリティ・ロールの追加(user_roles の role_name と一致している必要があります)とか(およびログイン用のページの作成とかエラー表示用ページの作成とか、それに合わせた UserBean の改修とか)いくつか作業も必要なので、そこのところを作成し文書化してから発表したいと思っています。
 では。
投稿:KILROY[KILROY]/2007年 04月 16日 11時 17分 /更新:2007年 04月 16日 11時 20分
Re^4:登録した人だけに書き込ませられる掲示板にしたい場合は・・?
by KILROY[KILROY]
 すんません。まだ悪戦苦闘中です。(T_T)

 現在、
 ・前文で公開した方法以外に、 JNDI 経由で取得したリソースを通じて認証をかける方法を Tomcat のマニュアルで見つけたこと。
 ・ MySQL のパスワード生成機能を利用していないので、データベース上には素の(=暗号化されていない)パスワードが現れてしまうこと。
 ・ Tomcat の認証をそのまま使ったときに、ログイン ID を取得する方法がよく分らないこと。

とかいった部分をなんとかしたいと思って調査中です。

 「ユーザ認証を行なっているデータベースに負荷をかけてシステムを落とす」という手口に対抗するため、「読み出し専用の認証用データベースサーバーを複数用意し、負荷分散をかける」ためにはデータベースを直接指定するとうまくないのと、 Tomcat の FORM 認証(閲覧に制限のある PDF にアクセスするなど、単にアクセス制限のかかったレルムにアクセスがかかったとき)を行なってからアプリケーション用の認証(掲示板に書込みを行なうときなど)をまた行なうのは二度手間になってしまう、というのを避けたいので。
投稿:KILROY[KILROY]/2007年 04月 18日 09時 39分 /更新:2007年 04月 18日 09時 39分