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

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

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

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

Java+MySQL+Tomcatで作る掲示板とブログ
Java+MySQL+Tomcatで作る
掲示板とブログ
潜在バグではないかと思うのですがいかがでしょうか。
by natsu1[natsu1]
お世話になります。

JSP業務アプリケーション短期開発入門付属のサンプルアプリケーションをLinuxサーバー上にデプロイしたところ、エラーが発生しました。
以下、そのエラーの解決をする過程で、
「この部分は潜在バグではないだろうか」
と思った部分がありました。

ここで、私は、何も著者の誤りを指摘したいわけではございません。
私の認識に間違いがないかということを確かめたいと思い、投稿しました。
もしかしたら、「これは、○○で△△という設定をしていれば回避できるエラーなんですよ」という回答が帰ってきて、「なるほど。そういう仕組みになってるのか」と、理解が深まる結果になるかもしれないと思い、投稿してみました。


〜〜以下、その潜在バグのように見える部分の詳細です。〜〜


JSP業務アプリケーション短期開発入門の115ページに、
grant all on jspdb.* to Mulder identified by 'TrustNo1';(@)
との記述があります。

Linux版のMYSQLの場合、@のSQLを実行後、Webアプリケーションを実行しても、MYSQLが、localhostからの接続を受け付けてくれず、エラーが発生します。

もし、localhostからの接続を受け付けるようにしたければ、
grant all on jspdb.* to Mulder@localhost identified by 'TrustNo1';
としないといけないようです。

ためしに、@のSQLを実行後、
select Host,User from mysql.user;
のSQL文を発行し、ユーザーに与えられた権限を見てみたところ、

+----------------+----------+------------------+
| Host          | User    | Password        |
+----------------+----------+------------------+
| %              | Mulder  | 2de80b9e59602b87 |
+----------------+----------+------------------+
となっています。(linux版、windows版ともに)

ここで、hostの"%"とは、
(a)Linux上のMysqlの場合、localhost以外の全てのhostからの接続を受け付ける
(b)Windows上のMysqlの場合、localhostを含む全てのhostからの接続を受け付ける
という違いがあるようです。

http://linux.kororo.jp/cont/server/mysql_user.php
(これは参考です)

Windows版のMysql上でのみ動作し、全てのホストからのDB接続が可能な仕様ということなのでしょうか。




投稿:natsu1[natsu1]/2008年 06月 20日 09時 39分 /更新:2008年 06月 20日 10時 13分
RE:潜在バグではないかと思うのですがいかがでしょうか。
by 竹形 誠司[takegata]
どうも、竹形です。

>Linux上のMysqlの場合、localhost以外の全てのhostからの接続を受け付ける

私の方ではLinux上でもそのような動作は確認できませんでした。次のようなテストをしてみてください。

1. 「test1」という名前のデータベース領域を作成
mysql> create database test1;
2. 「user1」という名前のユーザを作成し、test1に権限を付与
mysql> grant all on test1.* to user1 identified by 'TrustNo1';
3. mysql からexitして、user1で再ログイン
mysql> exit
$ mysql -u user1 -p
Enter password:
4. test1 データベース領域にアクセス
mysql> use test1
'%' が「localhost以外の全て」と解釈されるのであれば、ここでエラーになるはずです。

Passwordの文字数から察すると、お使いのMySQLのバージョンがだいぶ古いようですが、もしかしたらそれが関係しているかも知れません。
投稿:竹形 誠司[takegata]/2008年 06月 20日 13時 57分 /更新:2008年 06月 20日 13時 59分
RE:潜在バグではないかと思うのですがいかがでしょうか。
by natsu1[natsu1]
お世話になります。

これと同じテストを私のほうでも既に行ったのです。
念のため、もう一度やってみました。(両方ともlocalhostからのオペレーションです。)

その結果、

【Linux版のmysqlの場合】
3でエラー(ERROR 1045(28000): Access denied・・)となり、ログインできない。

ちなみに、ここで、mysql -u user1 とした場合、ログインできるが、先ほど作ったuser1とは別の新規ユーザーと認識されてログインしていることになるみたいで、
ログイン後、show databases; を実行してもtest1データベースは表示されず、4の use test1; もエラーとなります。

【windows版のmysqlの場合】
3でエラーとならず、ログインできる。
4もエラーとならず、実行できる。


それとmysqlのバージョンなのですが、以下のとおりです。
(バージョンの確認には、mysqladminコマンドを使用し、その応答結果を抜粋したものです)
Linux版のmysqlのバージョンが古いとも思えないのですが。

【Linux版のmysql】
Ver 8.41 Distrib 5.0.22, for redhat-linux-gnu on i686
Server version          5.0.22

【windows版のmysql】
Ver 8.41 Distrib 5.0.41, for Win32 on ia32
Server version          5.0.41-community-nt


ちなみに、
http://dev.mysql.com/doc/refman/5.1/ja/adding-users.html
ここでも、grant文の発行で、
GRANT ALL PRIVILEGES ON *.* TO 'monty'@'localhost'・・・
GRANT ALL PRIVILEGES ON *.* TO 'monty'@'%'・・・
とわざわざ、2回SQL文を発行しています。
そして、その後、mysql.user テーブルを見てみると別レコードとしてユーザーが登録されています。
竹形さんのご説明でいくと、1行目のほうは必要ないということになると思うのですが。。
投稿:natsu1[natsu1]/2008年 06月 20日 20時 25分 /更新:2008年 06月 20日 20時 32分
RE:潜在バグではないかと思うのですがいかがでしょうか。
by 竹形 誠司[takegata]
> ちなみに、ここで、mysql -u user1 とした場合、ログインできるが、先ほど作った
> user1とは別の新規ユーザーと認識されてログインしていることになるみたいで、
> ログイン後、show databases; を実行してもtest1データベースは表示されず、
> 4の use test1; もエラーとなります。

これはuserテーブルに匿名ユーザ(名前の無いユーザー)が登録されている場合に起こる現象です。匿名ユーザーを削除してから同様のテストを行ってみてください。

> 【Linux版のmysql】
> Ver 8.41 Distrib 5.0.22, for redhat-linux-gnu on i686
> Server version          5.0.22

これはそんなに古くないですね。password関数のハッシュ値が16バイトだったので、4.0より古いバージョンかと思ったのですが(バージョン4.1から41バイトになりました。)、これは思い過ごしでした。すみません。

> ちなみに、
> http://dev.mysql.com/doc/refman/5.1/ja/adding-users.html
> ここでも、grant文の発行で、
> GRANT ALL PRIVILEGES ON *.* TO 'monty'@'localhost'・・・
> GRANT ALL PRIVILEGES ON *.* TO 'monty'@'%'・・・
> とわざわざ、2回SQL文を発行しています。

これは、「monty@localhost と monty@% の2つが登録されている場合の説明」であって、両方を登録しなければならないということではないと思います。その後に匿名ユーザの説明もありますね。今回のケースは、これに該当するのではないでしょうか。
投稿:竹形 誠司[takegata]/2008年 06月 20日 22時 50分 /更新:2008年 06月 20日 22時 50分
RE:潜在バグではないかと思うのですがいかがでしょうか。
by natsu1[natsu1]
お世話になります。

>その後に匿名ユーザの説明もありますね。今回のケースは、これに該当するのではないでしょうか。

その通りだったようです。
delete from user where user='';
flush privileges;
を実行し、匿名ユーザーを削除&設定を反映したところ、問題なくDB接続ができました。

失礼いたしました。m(__)m

余談ですが、今回の原因をまとめると、
linux版のmysqlには、デフォルトで匿名ユーザーは登録されていて
windows版のmysqlには、デフォルトで匿名ユーザーは登録されていない
ということになると理解したのですが、この理解で間違いないと考えていいでしょうか。


投稿:natsu1[natsu1]/2008年 06月 21日 06時 52分 /更新:2008年 06月 21日 06時 52分
RE:潜在バグではないかと思うのですがいかがでしょうか。
by 竹形 誠司[takegata]
> linux版のmysqlには、デフォルトで匿名ユーザーは登録されていて
> windows版のmysqlには、デフォルトで匿名ユーザーは登録されていない

私が試したopen SUSE 10.3 で「ソフトウェア管理」からインストールしたmysqlでは匿名ユーザーは登録されていませんでした。インストールのしかたによるのかも知れませんね。そういえば、MySQLの過去のバージョンでは、Windows版でも匿名ユーザーがデフォルトで登録されていました。

私はMacOSやOpenSolrisでもMySQL5.0を使っていますが、デフォルトでは匿名ユーザは登録されていなかったと思います。最近のバージョンで匿名ユーザーが登録されているケースがあることを知らなかったので、勉強になりました。これについては、ブログに書きたいと思います。ご報告ありがとうございました。
投稿:竹形 誠司[takegata]/2008年 06月 21日 15時 15分 /更新:2008年 06月 21日 15時 30分