質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.78%

ユーザ認証でデータベースに登録されているデータを入力しても認証されない

受付中

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 739

javas

score 5

前提・実現したいこと

ログイン画面から送られてきたユーザー名とパスワードでデータベース内のデータを照合してユーザーの認証を行います。 
実際の処理としてはユーザー管理用のテーブルをユーザー名とパスワードが一致するレコードがあるかどうかを検索して、あれば認証する

発生している問題・エラーメッセージ

SQL文が間違っているわけでもなくエラーメッセージも
出力されていませんが、認証画面からデータベースに登録
されているデータを入力しても認証されません。

エラーメッセージが出ていないのでコンソールに出力された情報を入れます。
情報: Command line argument: -Dfile.encoding=UTF-8 
情報: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug 
logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.

該当のソースコード

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class AuthFilter1 implements Filter{
  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain){
    try{
      String target = ((HttpServletRequest)request).getRequestURI();

      HttpSession session = ((HttpServletRequest)request).getSession();

      if (session == null){
        /* まだ認証されていない */
        session = ((HttpServletRequest)request).getSession(true);
        session.setAttribute("target", target);

        ((HttpServletResponse)response).sendRedirect("/auth/Login");
      }else{
        Object loginCheck = session.getAttribute("login");
        if (loginCheck == null){
          /* まだ認証されていない */
          session.setAttribute("target", target);
          ((HttpServletResponse)response).sendRedirect("/auth/Login");
        }
      }

      chain.doFilter(request, response);
    }catch (ServletException se){
    }catch (IOException e){
    }
  }

  public void init(FilterConfig filterConfig) throws ServletException{
  }

  public void destroy(){
  }
}
import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class CustomAuth1 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
        throws IOException, ServletException{

        response.setContentType("text/html; charset=UTF-8");
        PrintWriter out = response.getWriter();
request.setCharacterEncoding("UTF-8");

        String target = request.getRequestURI();

        HttpSession session = request.getSession(false);

        if (session == null){
            /* まだ認証されていない */
            session = request.getSession(true);
            session.setAttribute("target", target);

            response.sendRedirect("/auth/Login");
        }else{
            Object loginCheck = session.getAttribute("login");
            if (loginCheck == null){
                /* まだ認証されていない */
                session.setAttribute("target", target);
                response.sendRedirect("/auth/Login");
            }
        }

        out.println("<html>");
        out.println("<head>");
        out.println("<title>ユーザー認証テスト</title>");
        out.println("</head>");
        out.println("<body>");

        out.println("<p>テストページ1</p>");

        out.println("<p><a href=\"/auth/CustomAuth2\">テストページ2へ</a></p>");

        out.println("</body>");
        out.println("</html>");
    }
}
import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class Login2 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
        throws IOException, ServletException{

        response.setContentType("text/html; charset=UTF-8");
        PrintWriter out = response.getWriter();
request.setCharacterEncoding("UTF-8");

        out.println("<html>");
        out.println("<head>");
        out.println("<title>ログインページ</title>");
        out.println("</head>");
        out.println("<body>");

        out.println("<h1>ログイン画面</h1>");

        HttpSession session = request.getSession(true);

        /* 認証失敗から呼び出されたのかどうか */
        Object status = session.getAttribute("status");

        if (status != null){
            out.println("<p>認証に失敗しました</p>");
            out.println("<p>再度ユーザー名とパスワードを入力して下さい</p>");

            session.setAttribute("status", null);
        }

        out.println("<form method=\"POST\" action=\"/auth/LoginCheck\" name=\"loginform\">");
        out.println("<table>");
        out.println("<tr>");
        out.println("<td>ユーザー名</td>");
        out.println("<td><input type=\"text\" name=\"name\" size=\"32\"></td>");
        out.println("</tr>");
        out.println("<tr>");
        out.println("<td>パスワード</td>");
        out.println("<td><input type=\"password\" pass=\"pass\" size=\"32\"></td>");
        out.println("</tr>");
        out.println("<tr>");
        out.println("<td><input type=\"submit\" value=\"login\"></td>");
        out.println("<td><input type=\"reset\" value=\"reset\"></td>");
        out.println("</tr>");
        out.println("</table>");
        out.println("</form>");

        out.println("</body>");
        out.println("</html>");
    }
}
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class LoginCheck2 extends HttpServlet {

    protected Connection conn= null;
    public void init() throws ServletException{

        String url = "jdbc:mysql://localhost:3306?characterEncoding=UTF-8&serverTimezone=JST&useSSL=false";
        String user = "root";
        String password ="root";

        try {
            Class.forName("com.mysql.jdbc.Driver").newInstance();
            conn = DriverManager.getConnection(url, user, password);
        }catch (ClassNotFoundException e) {
            log("ClassNotFoundException:" + e.getMessage());
        }catch(SQLException e) {
            log("SQLException:" + e.getMessage());
        }catch (Exception e) {
            log("Exception:" + e.getMessage());
        }
    }
    public void destory() {
        try {
            if(conn != null) {
                conn.close();
            }
        }catch (SQLException e) {
            log("SQLException:" + e.getMessage());
        }
    }
    public void doPost(HttpServletRequest request, HttpServletResponse response)
    throws IOException, ServletException{
          response.setContentType("text/html; charset=UTF-8");
          PrintWriter out = response.getWriter();
          System.out.println(out);

request.setCharacterEncoding("UTF-8");

        String name=request.getParameter("name");
        String pass=request.getParameter("pass");
        HttpSession session=request.getSession(true);
        boolean check = authUser(name, pass);
        if(check) {
            session.setAttribute("login", "OK");

        String target=(String)session.getAttribute("target");
        response.sendRedirect(target);
    }else {
        session.setAttribute("status", "Not Auth");
        response.sendRedirect("/auth/Login");
    }

    }
    protected boolean authUser(String name, String pass) {
        if(name == null ||  name.length() == 0 || pass == null || pass.length() == 0) {
            return false;
        }



        try {
            String sql = "SELECT name, pass FROM rensyu.member1 WHERE name = ? and  pass = ? ";
            PreparedStatement pstmt = conn.prepareStatement(sql);
            pstmt.setString(1,  name);
            pstmt.setString(2,  pass);

            ResultSet rs =pstmt.executeQuery();

            if(rs.next()) {
                return true;

            }else {

                return false;
            }

        }catch (SQLException e) {
            log("SQLException:" + e.getMessage());

            return false;
    }
}
}
import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class Logout1 extends HttpServlet {
  public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws IOException, ServletException{

    response.setContentType("text/html; charset=UTF-8");
    PrintWriter out = response.getWriter();
    System.out.println(out);
request.setCharacterEncoding("UTF-8");

    HttpSession session = request.getSession(true);
    session.invalidate();

    response.sendRedirect("/auth/Login");
  }
}

試したこと

➀SQL文の修正
➁データベースのテーブルの修正
➂デバッグ
→Eclipse上でソースコード(呼び出しを想定しているメソッドの先頭のステートメント)にブレークポイントを設定してサーバーをデバッグモードで実行しましたら、入力したデータはしっかり
入りました。

➃サーブレットのString name=request.getParameter("name");
String pass=request.getParameter("pass");
pstmt.setString(1,  name);            
pstmt.setString(2,  pass);            
でname、passに値を詰めて何が入っているかをSystem.out.printlnで確認した結果
・name(ユーザー名)は入力した正しいデータが出力されました
・pass(パスワード)も入力した正しいデータが出力されました。
※SQL文のCreateではどちらも文字列コードはUTF-8に設定しました。
(対象となっているテーブルを作成した際のSQL文)
CREATE TABLE member1 (
name varchar(100) DEFAULT NULL,
pass varchar(100) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8

補足情報(FW/ツールのバージョンなど)

・Eclipse 4.8
・MySQL5.7
・java1.8.0_211

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • javas

    2019/11/19 11:58

    コメントして頂いたことについて一通り実行してみました。

    キャンセル

  • A-pZ

    2019/11/20 00:36

    詳細なソースコードと設定ありがとうございました。検証してみますのでお待ちください。

    キャンセル

  • javas

    2019/11/20 14:45

    すみません。
    ありがとうございます。

    自分自身でもう一度見直してみます。

    キャンセル

回答 2

+4

out.println("<td><input type=\"password\" pass=\"pass\" size=\"32\"></td>");
nameでは

追記

・name(ユーザー名)は漢字で入力しましたが文字化けで出力されました
・pass(パスワード)は数字で入力しましたがnullで出力されました。

から分かる点として
①サーブレットにリクエストを投げること自体はできている(getParameter("name")で値の取得自体はできている)
②passを渡す箇所、もしくは受け取る箇所のどちらかがおかしい
③パラメータの文字コードがおかしい
の3点です。

②について
パラメータを受け取る部分に問題はなさそうに見受けられます。
となるとやはり入力側に問題がありそうです。
最初の回答で記述した部分が正しく修正できているかを確認してください。
(今回に限らず 修正を行った箇所は逐次質問文に反映させた方が解決につながりやすいです。)

③について
パラメータの文字コードを指定していないことが原因かと思われます。
パラメータを受け取るよりも前に
request.setCharacterEncoding("UTF-8");
を記述する必要があります。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/11/19 15:00 編集

    ありがとうございます。

    入力時、SQL文実行時のデータは共に正しいデータが入るようになりました。
    ですが、まだ認証できません。

    SQL文を実行したあとのif文に誤りがあるということでしょうか?

    キャンセル

  • 2019/11/19 15:54

    流石にコード全部読む気力がないので 一個気になったところを。
    init()メソッド内で
    conn = DriverManager.getConnection(url, user, password);
    してますが、init()を呼び出している箇所はありますか?

    (そもそもconnがnullのまま処理しようとしても例外出ないんでしたっけ?)

    キャンセル

  • 2019/11/20 14:44

    ありがとうございます。

    確認しましたが、やはりinit()はソースのどこにも使用されていませんでした。
    connがnullの場合は例外処理を入れるべきでした。

    キャンセル

0

デプロイメント・ディスクリプタ(web.xml)の記載ありがとうございました。

見たところ、認証済みかのチェックをつかさどっている、AuthFilter1 の定義がないので、動作していないようです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/11/21 14:58

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
    version="2.4">


    <filter>
    <filter-name>AuthFilter</filter-name>
    <filter-class>AuthFilter1</filter-class>
    </filter>

    <filter-mapping>
    <filter-name>AuthFilter</filter-name>
    <url-pattern>/CustomAuth1</url-pattern>
    </filter-mapping>

    <filter-mapping>
    <filter-name>AuthFilter</filter-name>
    <url-pattern>/CustomAuth2</url-pattern>
    </filter-mapping>

    <servlet>
    <servlet-name>CustomAuth1</servlet-name>
    <servlet-class>CustomAuth5</servlet-class>
    </servlet>

    <servlet-mapping>
    <servlet-name>CustomAuth1</servlet-name>
    <url-pattern>/CustomAuth1</url-pattern>
    </servlet-mapping>

    <servlet>
    <servlet-name>CustomAuth2</servlet-name>
    <servlet-class>CustomAuth6</servlet-class>
    </servlet>

    <servlet-mapping>
    <servlet-name>CustomAuth2</servlet-name>
    <url-pattern>/CustomAuth2</url-pattern>
    </servlet-mapping>

    <servlet>
    <servlet-name>Login</servlet-name>
    <servlet-class>Login2</servlet-class>
    </servlet>

    <servlet-mapping>
    <servlet-name>Login</servlet-name>
    <url-pattern>/Login</url-pattern>
    </servlet-mapping>

    <servlet>
    <servlet-name>LoginCheck</servlet-name>
    <servlet-class>LoginCheck2</servlet-class>
    </servlet>

    <servlet-mapping>
    <servlet-name>LoginCheck</servlet-name>
    <url-pattern>/LoginCheck</url-pattern>
    </servlet-mapping>

    <servlet>
    <servlet-name>Logout</servlet-name>
    <servlet-class>Logout1</servlet-class>
    </servlet>

    <servlet-mapping>
    <servlet-name>Logout</servlet-name>
    <url-pattern>/Logout</url-pattern>
    </servlet-mapping>
    </web-app>

    以上が編集したweb.xmlファイルです。

    キャンセル

  • 2019/11/21 22:10

    CustomAuth5やCustomAuth6の定義がありますが、この質問に書かれていないクラスではないでしょうか?

    一度、最新の実装状態で質問を書き直された方が良いです。(ないしは一度質問をクローズするなど)

    キャンセル

  • 2019/11/22 10:27

    customAuth5が以前のcustmoAuth3で、customAuth6がcoutomAuth4の部分に当たります。
    こちらのクラスを質問に追加しようとしましたがteratailの質問の文字数規定に達するため
    追加できませんでした。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.78%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る