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