• 締切済み

JDBCレルムによるFORM認証

お世話になります。 StrutsのJDBCレルムによるFORM認証について教えて下さい。 パスワードをSHAで暗号化したテーブルを使ってj_security_checkによる認証をさせたいのですが認証エラー(ID、Passwordが誤っています。 )となってしまいます。 DBはMySQLです。 SQLのログを見ると「SELECT password FROM users WHERE email = 'メールアドレス';」というログしか出ません。 このSQLをMySQLで実行すると暗号化されたパスワードが取得されます。 暗号化の方法が間違っているのか、JDBCレルムの指定が間違っているのかのいずれかとは思うのですが切り分け方法がわかりません。 TOMCATのログにもそれらしき情報が出ていないのですが、どのようにしたら認証エラーとなっている原因を調べることができるのでしょうか?

  • Java
  • 回答数1
  • ありがとう数1

みんなの回答

  • teketon
  • ベストアンサー率65% (141/215)
回答No.1

とりあえず、どこまで確認できていますか? ・DIGESTなしなら認証できる。 ・認可の設定が確認できる。などなど 失敗するようなら、機能分割して確認できるところを分けましょう。 >TOMCATのログにもそれらしき情報が出ていないのですが、どのようにしたら認証エラーとなっている原因を調べることができるのでしょうか? 上記以外では、TOMCATをデバッグモードで起動し、TOMCATのソースと照らし合わせるくらいです。 セキュリティ上の問題があるので、安易にログに出てくることは期待しないほうが良いです。

miruha2011
質問者

お礼

ご回答ありがとうございます。 アドバイスに従い、まずは平文での認証を試したところ認証されませんでした。 原因はContextのpathの指定が間違っていた為でした。 修正して平文での認証は通るようになりましたので暗号化を試したところダメでした。 パスワードは MessageDigest md = MessageDigest.getInstance("SHA"); md.update("1234".getBytes()); md.digest(); として得られたものを入れていますので、 Realmでは digest="SHA" と指定しています。 暗号化の種類が間違っているのでしょうか?

関連するQ&A

  • JDBCレルムによるFORMパスワード認証

    JDBCレルムによるFORMパスワード認証 以下のようなエラーが出てデータベースに接続できません: 2010/03/28 4:13:21 org.apache.catalina.realm.JDBCRealm start 致命的: データベース接続オープン中に例外が発生しました java.sql.SQLException: org.gjt.mm.mysql.Driver at org.apache.catalina.realm.JDBCRealm.open(JDBCRealm.java:704) at org.apache.catalina.realm.JDBCRealm.start(JDBCRealm.java:786) server.xmlのデータベースに関する部分は以下の通りです: <Realm className="org.apache.catalina.realm.JDBCRealm" connectionURL="jdbc:mysql://127.0.0.1/authorization" driverName="org.gjt.mm.mysql.Driver" connectionName="root" connectionPassword="" ←ここは空欄でいいですか? roleNameCol="role" userCredCol="password" userNameCol="username" userRoleTable="roles" userTable="users" /> …検索してみるとorg.gjt.mm.mysql.Driverは古いのでcom.mysql.jdbc.Driverを使うべき、とありました (http://www.javadrive.jp/servlet/auth/index5.html)。 しかし、org.gjt.mm.mysql.Driverをcom.mysql.jdbc.Driverに変えてみましたが、結果は変わりません。 本来、どちらが正しいのでしょうか? ←まずはこの質問の回答をお願いします あと、自分のMySQLはユーザー名は"root"で設定してあるのですが、パスワードは設定していません (つまり、MySQLをコマンドラインから起動するときはパスワードを空欄のままEnterを押して入れます)。 自分の場合、connectionNameとconnectionPasswordは上記の通りで良いのでしょうか?  ←次にこの質問の回答をお願いします Tomcatのライブラリは以下の通りです: Directory of C:\apache-tomcat-6.0.26\lib [.] [..] annotations-api.jar catalina-ant.jar catalina-ha.jar catalina-tribes.jar catalina.jar el-api.jar jasper-el.jar jasper-jdt.jar jasper.jar jsp-api.jar servlet-api.jar tomcat-coyote.jar tomcat-dbcp.jar tomcat-i18n-es.jar tomcat-i18n-fr.jar tomcat-i18n-ja.jar MySQLのデータはちゃんと入力されており、MySQL単体であれば、もちろん動作します: mysql> select * from roles; +----+----------+--------+ | id | username | role | +----+----------+--------+ | 1 | nakamura | member | | 2 | tanaka | member | +----+----------+--------+ mysql> select * from users; +----+----------+----------+ | id | username | password | +----+----------+----------+ | 1 | nakamura | 1234 | | 2 | tanaka | 5678 | +----+----------+----------+ …では、宜しくお願いします。

    • ベストアンサー
    • Java
  • JDBCに初めて挑戦しようとしたのですが。

    「JAVA+MySQL+Tomcatで始めるWebアプリケーション開発入門」という本でJDBCに初めて挑戦しようとしたのですが、下記のようなエラーが出てうまく実行できませんでした。 java.sql.SQLException: Access denied for user: 'Mulder@localhost' (Using passwor d: YES) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2928) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:771) at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1229) at com.mysql.jdbc.Connection.createNewIO(Connection.java:2558) at com.mysql.jdbc.Connection.<init>(Connection.java:1485) at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java :266) at java.sql.DriverManager.getConnection(Unknown Source) at java.sql.DriverManager.getConnection(Unknown Source) at JdbcTest.main(JdbcTest.java:12) Exception in thread "main" java.lang.NullPointerException at JdbcTest.main(JdbcTest.java:24) 原因など、わかる方がいたら教えていただきたいです。 よろしくお願いします。

    • ベストアンサー
    • Java
  • JDBCについて

    JDBCを用いたMySQLデータベースへの接続方法について質問があります。 【現在の状況】 tomcatをインストール済み(正常に作動・・・起動した状態で、http://localhost:8080/に接続できます。) MySQLをインストール済み(正常に作動・・・データベースを作成できます。(例えば、sampleとします。)) JDBCドライバをセットアップ済み(CLASSPATHの設定も問題ありません。) しかし 作成したデータをjavaプログラムを用いて表示しようとしたところ com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Access denied for user ''@'localhost' to database 'sample' というエラーが出てしまいました。 データベースへのアクセスが拒否されたとあるのですが 理由がわからずに困っております。 接続は、以下のようにしています。 Class.forName("com.mysql.jdbc.Driver"); Connection cn = DriverManager.getConnection("jdbc:mysql:///cardb", "", ""); 解決策をご存知の方いらっしゃいましたら 御指導願います。

    • ベストアンサー
    • Java
  • TomcatのJDBC連携について

    TomcatのJDBC連携について javax.servlet.ServletException: Cannot create JDBC driver of class '' for connect URL 'null' というエラーが消えず、知恵をお貸しください。 他にも同様のケースについて調べては見たのですが解決しません。 ■環境 Windows XP SP3 Eclipse3.6(Pleiades All in One 3.6.0.20100623) apache-tomcat-5.5.29 mysql-essential-5.1.48 ■設定 ■server.xml に下記を追加 <Context docBase="Test" path="/test" reloadable="true" source="org.eclipse.jst.j2ee.server:Test"> </Context> ■Tomcat 5.5/conf/Catalina/localhost/Test.xml に下記を記載 <Context docBase="${catalina.home}/server/webapps/test" privileged="true" antiResourceLocking="false" antiJARLocking="false"> <Resource name="jdbc/MySQL_JDBC" auth="Container" type="javax.sql.DataSource" factory="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost/test?useUnicode=true&characterEncoding=sjis" username="**" password="**" maxActive="20" maxIdle="30" maxWait="1800"/> </Context> ■Webアプリケーション配下の web.xmlに下記を追加 <resource-ref> <res-ref-name>jdbc/MySQL_JDBC</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> </resource-ref> ■JSPソースに下記を記載 jdbc.jsp <% InitialContext initCon = new InitialContext(); DataSource ds = (DataSource) initCon.lookup("java:comp/env/jdbc/MySQL_JDBC"); Connection con = ds.getConnection(); Statement stmt = con.createStatement(); ResultSet result = stmt.executeQuery("select * from mytable;"); while (result.next()) { 表示処理 } con.close(); initCon.close(); %> 別途作成した下記JSPではデータ取得はできています。 <% Class.forName("com.mysql.jdbc.Driver"); Connection conn=DriverManager.getConnection("jdbc:mysql://localhost/test?" + "user=tester&password=tester&useUnicode=true&characterEncoding=Shift_JIS"); Statement st=conn.createStatement(); ResultSet res = st.executeQuery("select * from mytable");

    • ベストアンサー
    • Java
  • JDBCドライバがない?

    PostgreSQLを使ったJavaアプリケーションをつくり、接続テストをしたところ、Tomcatのエラーで、HTTPステータス500となりました。 メッセージ: 「Cannot create JDBC driver of class '' for connect URL 'null'」 原因 org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot create JDBC driver of class '' for connect URL 'null' 原因 java.sql.SQLException: No suitable driver java.sql.DriverManager.getDriver(DriverManager.java:243) と表示されますので、JDBCのclassがないことが原因のようですが、どこを調べればよいかわかりません。 初心者です。よろしくご教授ください。 環境は次のとおりです。 OS:Linux(CentOS5) Tomcat5.5.28 PostgreSQL8.2.14 JDBCドライバ:postgresql-8.2-510.jdbc3.jar /var/webapps/tomcat/common/libに入れてあります。 環境変数のPATHの指定してあります。

  • MySQL と JDBCで・・・

    質問させてください。 windows98に ・j2sdk-1_4_1_07-windows-i586.exe ・mysql-4.0.25-win32.zip ・mysql-connector-java-3.1.10.zip をダウンロードしました。 環境変数を設定し javaソースコードを作成しました。 コンパイルは出来たのですが、実行すると コマンドプロンプトに java.sql.SQLException: Access denied for user: '@localhost' to database 'hellodb ' at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2921) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:770) at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1228) at com.mysql.jdbc.Connection.createNewIO(Connection.java:2544) at com.mysql.jdbc.Connection.<init>(Connection.java:1474) at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java :264) at java.sql.DriverManager.getConnection(DriverManager.java:512) at java.sql.DriverManager.getConnection(DriverManager.java:193) at HelloWorldJDBCMySQL.main(HelloWorldJDBCMySQL.java:15) と表示されてしまいます。 過去ログを見させていただきましたが自分の求める回答を見つけきれませんでした。 どなたかご教授のほど、よろしくお願いします。

  • JDBC実行時に認証エラーとなる

    皆さんこんにちわ。 JDBCに関して解決に至らない事があり、 アドバイスをいただきたく、質問させていただきます。 MySQLの初心者ですが、 優しい目でアドバイスいただけると大変ありがたいです。 どこにでもあるような下記JDBCを利用して、 MySQLに接続を行うだけの簡単なプログラムをコンパイルし、 実行してみましたが、 MySQLでの認証に引っかかってしまい、 接続に失敗しています。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ import java.net.*; import java.sql.*; class test5 { public static void main(String args[]) { try { //JDBCドライバをロードする Class.forName("com.mysql.jdbc.Driver"); //データベースに接続する String url = "jdbc:mysql://localhost/testdb"; String user = "test"; String pass = "test!"; Connection con = DriverManager.getConnection(url,user,pass); System.out.println("データベースに接続しました"); //データベースから切断する con.close(); System.out.println("データベースを切断しました"); } catch (Exception e) { System.out.println("例外 " + e + " が発生しました"); } } } # javac test5.java # java test5 例外 java.sql.SQLException: Invalid authorization specification message from server: "Access denied for user 'root'@'localhost' (using password: YES)" が発生しました 試しに、「test」というユーザ名と「test!」というPWDで、 MySQLにログインし、 「testdb」というDBを選択すると、 それは可能なようです。 また、 「mysql-connector-java-3.0.17-ga-bin.jar」は、 「/usr/java/jdk1.6.0_07/lib/mysql-connector-java-3.0.17-ga」ディレクトリに 保存されています。 環境変数は、 以下のようにしています。 export CLASSPATH=.:$JAVA_HOME/lib/mysql-connector-java-3.0.17-ga/mysql-connector-java-3.0.17-ga-bin.jar ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # mysql -u test -p Enter password: mysql> use testdb; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed

    • ベストアンサー
    • MySQL
  • JDBCレルム

    以下の環境で、FORM認証の動作を確認していましたが、 なぜか、ログインできず、ID,パスワードが違うというページばかりに 遷移してしまいます。 また、以前、古い環境で動いていた、プロジェクトも同様に動作しません。 エラーが全くログやeclipsのコンソールに表示されないので何が原因なのか 分かりません。(tomcat起動時も特にエラーやワーニングはありません。) 環境がWindows8PROの64bit版だからなのでしょうか? 今まで古い環境で動作していたものが動かないのがおかしいです。 環境の差と言えば WindowsXpからWindows8PRO64bit版に変更 MYSQLドライバがcommon/ibからlibに変更 MYSQLのバージョンアップ(ドライバ含む) すみませんが、どなたかご意見をいただきたいです。 宜しくお願いします。 PS:もしかしたらDBの文字コードも関係あるのでしょうか?    phpMyAdminではUTF-8となっていますが、my.iniの設定ではUTF-8の    設定はしていません(試してみます) 現在の環境 Windows8PRO64bit tomcat6 java7 IE10 MYSQL5.0 MYSQLドライバ-mysql-connector-java-5.1.24-bin.jar 参考までに古い環境 WindowsXp tomcat5.5 java5 IE8 MYSQL4.X

  • ログイン認証で

    ログイン認証で <? session_start(); $con=mysql_connect(localhost,***,***); mysql_select_db("***"); $passwd=addslashes($_POST['passwd']); $email=addslashes($_POST['email']); $name=addslashes($_POST['name']); $sql="select * from users where email='{$_POST['email']}' and passwd='{$_POST['passwd']}'"; $_session['name']=$name; $rs=mysql_query($sql); if(mysql_num_rows($rs)>0){ $_session['login']=1; header('location:'. "top.php"); exit; } mysql_close($con); ?> <html> <head> <title> </title> </head> 認証失敗 <br> <a href="login.php"> 戻る</a> <body> と入力したのですが、 emailとpasswdに合ったnameを違うページに表示したいのに、それができないんです・・・ ようこそ<? $_SESSION['name']?> さん<br> どこかおかしなところありますか?

    • ベストアンサー
    • PHP
  • JDBCが見つからないとメッセージが出る

    PostgreSQLをバージョン8.2から9.2にUPし、Tomcatをバージョン5から7にUPしました。 そのほか、OSはWindows7でローカルシステムを構築中です。 実行すると、HTTPステータス500javax.naming.NamingException: Could not load resource factory class [Root exception is java.lang.ClassNotFoundException: org.apache.commons.dbcp.BasicDataSourceFactory] とエラーが出ます。 以下の環境設定の間違いと思われますが、どこを直せばよいかわかりません。 よろしくご教授ください。 PostgreSQLは、C:\Program Files\postgresql9.2に配置しました。 Tomcatは、C:\Tomcat7に配置しました。 システムはC:\Tomcat7\webapps\test1に配置しました。 JDBCドライバは、postgresql-9.1-901.jdbc3.jar と postgresql-9.1-901.jdbc4.jar を C:\Tomcat7\libnにコピー&ペーストしました。 接続の定義は、C:\Tomcat7\conf\catalina\localhost に test1.xmlファイルを作りました。 以下がその記述です。 <?xml version='1.0' encoding='utf-8'?> <Context path="/test1" reloadable="true" docBase="C:\Tomcat7\webapps\test1" workDir="C:\Tomcat7\work" > <Resource name="jdbc/RDBMS" auth="container" type="javax.sql.DataSource" debug="1" factory="org.apache.commons.dbcp.BasicDataSourceFactory" driverClassName="org.postgresql.Driver" username="postgres" password="postgres" maxActive="100" maxIdle="30" maxWait="10000" url="jdbc:postgresql://localhost:5432/LocalDB" removeAbandoned="true" removeAbandonedTimeout="300" /> </Context>

専門家に質問してみよう