Glassfish 3.1 で非常に基本的な JDBC レルム認証を設定しようとしています。アプリケーションは、1 つのビジネス メソッドを持つ EJB と、リモート クライアント アプリケーション (Web アプリケーションではない) で構成されます。ここで何か基本的なことが欠けていると思います。
Java EE 6 チュートリアルに従い、すべての手順を完了しました。エラーは発生しませんが、ユーザー名とパスワードが正しいものとして受け入れられません。ユーザーとグループを格納するために単一のテーブルを使用しようとしているため、認証に使用されるテーブルの構造に問題がある可能性があると思います。(私よりも知識のある人による別の投稿で、これが可能であることが言及されており、公式のチュートリアルでも単一のテーブルが使用されています。すべてのユーザーは 1 つのグループ (「ユーザー」) に属するため、 2 番目のテーブルです。アプリはできるだけシンプルに保ちたいと考えています。)
1 つのテーブル ('ACCOUNTS') を持つデータベース ('auth') があります。これには 3 つのフィールドがあります。主キーである 'NAME'、'PASSWORD' および 'GROUPS' です。テーブルに制約はありません。
ユーザーを追加しました:
INSERT INTO ACCOUNTS (NAME, PASSWORD, GROUPS) VALUES ('Bob', 'bob', 'users');
私の glassfish-application.xml には、ロール マッピングとレルムが指定されています。
<glassfish-application>
<security-role-mapping>
<role-name>users</role-name>
<group-name>users</group-name>
</security-role-mapping>
<realm>jdbcRealm</realm>
</glassfish-application>
レルム設定: (Glassfish スクリーンショット)
Realm Name: jdbcRealm
JAAS Context: jdbcRealm
User Table: auth.ACCOUNTS
User Name Column: name
Password Column: password
Group Table: auth.ACCOUNTS
Group Name Column: groups
豆:
@Stateless
@DeclareRoles("users")
public class ProtectedBean implements ProtectedBeanRemote {
private static final Logger logger = Logger.getLogger(ProtectedBean.class.getName());
@Override
@RolesAllowed("users")
public void doProtectedStuff() {
logger.log(Level.INFO, "Protected method accessed.");
}
}
JDBC 接続プールとリソースも作成されます。
リモート クライアントから Bean を呼び出すと、ログイン プロンプトが表示されます。名前とパスワードを入力すると、SecurityException が発生します。
javax.security.auth.login.LoginException: Security Exception
at javax.security.auth.login.LoginContext.invoke(LoginContext.java:870)
...
Caused by: java.lang.SecurityException
at javax.security.auth.login.LoginContext.invoke(LoginContext.java:871)
この後、名前/パスワードが間違っている場合と同様に、再度ログイン ウィンドウが表示されます。レルムを使用すると、file
完全に機能しますが、jdbc レルムでは機能しません。
テーブルは別のものにする必要がありますか?(複数のテーブルを使用する必要がありますか?) それとも何か間違っていますか? 前もって感謝します!