2

私はJava EEが初めてです。ユーザーの資格情報を認証するためのログイン フォームとサーブレットを作成しましたが、getRemoteUser()認証後にメソッドでリモート ユーザーを確認すると、コードにユーザー名が表示されません。

私のログインサーブレットは次のとおりです。

String uname,pass;
PreparedStatement ps=null;
uname=request.getParameter("uname");
pass=request.getParameter("pass");

ResultSet rs = null;
Connection con = null;
try {
    con = prepareConnection();

    String Query="select uname,email from passmanager where pass=?";
    ps=con.prepareStatement(Query);

    ps.setString(1,pass);
    rs=ps.executeQuery();

    while(rs.next())
    {
        if (uname.equals(rs.getString("uname")) || uname.equals(rs.getString("email"))) 
        {
            rs.close();                                                              
            ps.close();                                                            
            ps = null;                                                             
            con.close();                                                            
            con = null;  
            HttpSession session = request.getSession(true); 
            session.setAttribute("currentSessionUser",uname); 
            RequestDispatcher dis = request.getRequestDispatcher("/user.html");
            dis.forward(request, response);
            break;
        }
    }
}
catch(Exception e)
{
    System.out.println(e);
}

何か変更/修正が必要な場合は、教えて助けてください....よろしくお願いします。

4

3 に答える 3

8

はコンテナ管理認証HttpServletRequest#getRemoteUser()一部であり、基本的にはの単純なXML構成エントリです。<security-constraint>web.xml

しかし、完全に自家製のサーブレットがあり、実際にはDBインタラクションのかなり悪い仕事もします(WHEREユーザー名とパスワードの両方の句によってSQLではなくJavaで比較を実行します。さらに、JDBCリソースをリークします。で閉じないでくださいfinally)。

基本的に2つのオプションがあります。

  1. 認証を自家栽培しないでください。悪い、非効率的でリソースリークのあるコードをすべて削除し、コンテナ管理の認証を使用します。キックオフの例は、次の回答にあります。JSP/サーブレットへのアクセスを特定のユーザーのみに制限する

  2. ログインしたユーザーを、session.getAttribute("currentSessionUser")および/または${currentSessionUser}代わりに取得し、アクセス制限用のサーブレットフィルターを自家栽培するだけです。キックオフの例は、次の回答にあります。Javaのフィルターを使用したユーザー名とパスワードの認証(データベースへの接続)

于 2013-02-04T12:43:01.890 に答える
2

@BalusCの応答に追加するために、Javaサーブレット3.0(Java EE 6の一部)のjavax.servlet.http.HttpServletRequestのセキュリティメソッドを使用したコンテナ管理認証への別のアプローチあります– 、および。これらはHttpServletRequestオブジェクトの新しいメソッドであり、ほとんど気付かれることはありませんでした(これらの簡略化を使用して、このJava EEバージョンに到達するのに非常に時間がかかった場合、なぜ異なるはずでしたか?)。loginlogoutauthenticate

プログラムまたは宣言型のアプローチに関係なく、最終的にはアプリケーションサーバーでユーザーリポジトリを構成する必要があり(その部分はコンテナ固有です)、展開記述子でユーザーリポジトリを指すようにレルムを定義する必要がありますweb.xml(デフォルトではニーズに合わない-、、BASICまたはFORMCLIENT_CERT

あなたの場合、サーブレットはあまりにも多くのことを行います-ユーザーの取得を担当する部分は、アプリケーションサーバーのカスタムユーザーレジストリハンドラーの一部である必要があります(またはさらに良いことに-アプリケーションサーバーですでに利用可能なものを再利用します-WebSphereV8.5LibertyプロファイルまたはWebSphere V8.5)および定義されたら、上記の新しいセキュリティ方式で使用<security-constraint>します。web.xml

于 2013-02-05T13:07:25.963 に答える
0

この方法でユーザーをログに記録していません。「currentSessionUser」という名前のセッション属性を設定しましたが、コンテナはこれを「認証されたユーザー」として認識していません。

この構成の方法については、「レルム構成(コンテナーの名前)」を検索してください。各コンテナには、これを行う方法があります。:)

于 2013-02-04T12:43:01.423 に答える