Я не уверен, какой материал вы использовали для настройки области JDBC, но он кажется неполным или неправильным.Ниже приведено описание конфигурации, которую я использовал для настройки области JDBC.
Структура базы данных (в виде операторов DDL):
Таблица USERS
CREATE TABLE USERS (
USERID VARCHAR(50) NOT NULL,
PASSWORD VARCHAR(128) NOT NULL
);
--//@UNDO
DROP TABLE USERS;
Таблица ГРУПП
CREATE TABLE GROUPS (
GROUPID VARCHAR(20) NOT NULL
);
--//@UNDO
DROP TABLE GROUPS;
Таблица объединения USERS_GROUPS
CREATE TABLE USERS_GROUPS (
GROUPID VARCHAR(20) NOT NULL,
USERID VARCHAR(50) NOT NULL
);
--//@UNDO
DROP TABLE USERS_GROUPS;
Фрагмент конфигурации JDBCRealm Glassfish из domain.xml
:
<auth-realm name="MyRealm" classname="com.sun.enterprise.security.auth.realm.jdbc.JDBCRealm">
<property description="null" name="jaas-context" value="jdbcRealm"></property>
<property name="encoding" value="Hex"></property>
<property description="null" name="password-column" value="PASSWORD"></property>
<property name="datasource-jndi" value="jdbc/myDS"></property>
<property name="group-table" value="USERS_GROUPS"></property>
<property name="user-table" value="USERS"></property>
<property description="null" name="group-name-column" value="GROUPID"></property>
<property name="digest-algorithm" value="SHA-512"></property>
<property description="null" name="user-name-column" value="USERID"></property>
</auth-realm>
Обратите внимание, что атрибут group-name-column
имеет значение GROUPID
, которое отображается в столбец GROUPID
таблицы объединения USERS_GROUPS
, а негрупповой стол GROUPS
.Это связано с тем, что JDBCRealm выдает следующие операторы SQL (если вы декомпилируете класс com.sun.enterprise.security.auth.realm.jdbc.JDBCRealm
):
Запрос пароля, а идентификатор пользователя является параметром, который передается из DigestLoginModule:
SELECT <passwordColumn> FROM <userTable> WHERE <userNameColumn> = ?
Групповой запрос с идентификатором пользователя, передаваемым в качестве параметра:
SELECT <groupNameColumn> FROM <groupTable> WHERE <groupTableUserNameColumn> = ?;
Когда вы рассматриваете структуру второго запроса, совершенно очевидно, что таблица Group должна содержать либо сопоставленный идентификатор пользователяк идентификатору группы (что приводит к дублированию данных группы для пользователей, сопоставленных с несколькими группами) или к тому, что таблица группы должна быть таблицей объединения, которая отображает пользователей в группы.