3

Servlet 3.0 の request.login(username, password) メソッドを使用して jdbcRealm を操作しようとしていますが、何か問題があるようです。jdbcRealm を FORM 認証で動作させる方法に関する記事や、新しい request.login メソッドの使用方法に関する記事はたくさんありますが、両方が一緒に動作することを示す記事は見たことがありません。

アプリケーション サーバー - GlassFish 3.1.2
IDE - Netbeans 7.3
RDBMS - SQL Server 2008 R2
JDBC - Microsoft JDBC 4.0 ドライバー

これを機能させる方法について、コミュニティからの支援をいただければ幸いです。前もって感謝します!

まず、jquery ajax 呼び出しを SignInService サーブレットに送信しています。送信する前に、SHA-512 の jsSHA ライブラリを使用してパスワードをエンコードしています。

var encodedPassword = new jsSHA($("#omSignInPassword").val(), "TEXT");

$.ajax({
      url: "SignInService",
      data: {
        username : $("#SignInUserName").val(),
        password : encodedPassword.getHash("SHA-512", "HEX")
      }
...
});

これはChromeが送信していることを示しています:

username:admin
password:b109f3bbbc244eb82441917ed06d618b9008dd09b3befd1b5e07394c706a8bb980b1d7785e5976ec049b46df5f1326af5a2ea6d103fd07c95385ffab0cacbc86

サーブレットはリクエスト パラメータを受け取り、ログインを試みます。

  username = request.getParameter(PARAM_USERNAME);
  password = request.getParameter(PARAM_PASSWORD);

  request.login(username, password);

GlassFish コンソールに表示されるエラーは次のとおりです。

重大: jdbcrealm.invaliduserreason 警告: WEB9102: Web ログインに失敗しました: com.sun.enterprise.security.auth.login.common.LoginException: ログインに失敗しました: セキュリティ例外
重大: サーブレット例外: javax.servlet.ServletException: 試行中に例外がスローされましたユーザーの認証: admin
警告: DPL5032: web.xml 記述子で認証方法が定義されていません。ログイン構成にデフォルトの BASIC を使用します。
警告: ロール [ユーザー] にマップされたプリンシパルはありません。

では、設定に移ります...

ここに私のweb.xmlがあります:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
    <login-config>
        <realm-name>omRealm</realm-name>
    </login-config>
    <security-role>
        <description/>
        <role-name>User</role-name>
    </security-role>
</web-app>

ユーザー表:

CREATE TABLE [OM_SECURITY].[User](
    [UserID] [int] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](32) NOT NULL,
    [Password] [char](128) NOT NULL,
    [LastName] [nvarchar](32) NULL,
    [FirstName] [nvarchar](32) NULL,
    [Email] [nvarchar](64) NULL
) ON [PRIMARY]

このテーブルには 1 つのレコードが存在します。

1   admin   B109F3BBBC244EB82441917ED06D618B9008DD09B3BEFD1B5E07394C706A8BB980B1D7785E5976EC049B46DF5F1326AF5A2EA6D103FD07C95385FFAB0CACBC86    NULL    NULL    NULL

(パスワードは今のところ「password」のみです)

これは、すべてのユーザーを「ユーザー」グループに入れるために使用されるビューです。これは非常に基本的なものであり、コア機能が整ったら後で変更します。私のアプリケーション要件は、JAAS ロールが提供するものよりもはるかに複雑であるように思われるため、JAAS ロールを使用する予定はありません。これはおそらく別の議論ですが、何らかの形でこれが認証に影響を与えている場合を除きます。

CREATE VIEW [OM_SECURITY].[SignInGroup]
AS
SELECT     'User' AS GroupName, Name AS UserName
FROM         OM_SECURITY.[User]

接続プールはテスト済みで、問題なく動作します。Realm は、default-config ではなく、server-config セクションでセットアップされました。

JAAS Context:  jdbcRealm
JNDI:  jdbc/omSecurity
User Table:  OM_SECURITY.User
User Name Column:  Name
Password Column:  Password
Group Table:  OM_SECURITY.SignInGroup
Group Table User Name Column:   UserName
Group Name Column:  GroupName
Assign Groups: (blank)
Database User:  (blank)
Database Password:  (blank)
Digest Algorithm: SHA-512
Password Encryption Algorithm:  AES
Encoding: Hex
Charset: (blank)

Realm と Connection Pool の設定が格納されているファイルを誰かが教えてくれたら、代わりに XML としてここに投稿します。

これは GlassFish フォーラムにも投稿されました。

http://www.java.net/forum/topic/glassfish/glassfish-webtier/using-servlet-requestlogin-jdbcrealm

更新:フォームベースの簡単なログインをまとめたところ、それも失敗しているため、問題は私のレルムにあるようです。次のログレベルを調整しました。

Configurations\
server-config\
Logging\
ログ レベル\

javax.enterprise.system.core.security = FINE

com.microsoft.sqlserver.jdbc = ファイン

SQL Server によると、クエリは正常に実行されており、接続プールからスローされる例外はありません。

FINE: SQLServerPreparedStatement:3: calling sp_prepexec: PreparedHandle:0, SQL:SELECT Password FROM omUser WHERE Name = @P0 
4

2 に答える 2

4

でログインしています

username = request.getParameter(PARAM_USERNAME);
password = request.getParameter(PARAM_PASSWORD);
request.login(username, password);

パスワードはすでにハッシュされています。request.login() はプレーン テキスト バージョンを取得し、コンテナはそれをデータベース内のハッシュ バージョンと比較すると思います。

補足として、クライアントでパスワードをハッシュすることは一般的に悪い習慣と考えられており、ssl を介してプレーンテキストとして送信する必要があります。データベースのハッシュ (+salt) は、ハッカーがデータベースを侵害した場合に別のユーザーとしてログインできないようにするために使用されます。ハッシュ化されたパスワードを保存すると、これを防ぐことができますが、サーバーがプレーン テキストのパスワードを受け入れる場合に限られます。ハッシュ化されたパスワードを受け入れる場合、必要なものはすべて揃っています。

于 2012-11-05T02:15:13.497 に答える
1

GlassfishのjdbcRealmを使用した経験に基づいて、

request.login(username, password);

ここでの password には、ハッシュされたパスワードではなく、ユーザーが入力したプレーン パスワードが含まれている必要があります。これは、jdbcRealm の仕事であるためです。パスワードの値として使用したハッシュ化されたパスワードは、レルム構成に基づいて引き続きハッシュ化されるため、認証エラーが発生する理由を説明できます。

前回これを行ったときの jdbcRealm 構成は次のとおりです。

Password Encryption Algorithm: SHA-256
Digest Algorithm: SHA-256
Charset: UTF-8
于 2014-01-27T07:56:05.420 に答える