Членство в GlassFish JDBC Realm Group
Я был занят настройкой аутентификации, в частности, области JDBC, на GlassFish 3.1. Я действовал в предположении, что:
- Таблица "Пользователь" содержит имя пользователя ("адрес электронной почты") и пароль ("пароль")
- Таблица "Группа" содержит список имен групп ("имя")
- Таблица "User_Group" соответствует пользователям и группам.
Однако нигде я не мог настроить таблицу "User_Group", поэтому мне было интересно, как сервер сможет сопоставить пользователей с группами. Излишне говорить, что это не сработало. Однако более тщательная проверка предполагает, что:
- Таблица "Пользователь" содержит имя пользователя ("адрес электронной почты") и пароль ("пароль")
- Таблица "Group" содержит имя для входа ("email_address") в качестве первичного ключа и разделенный запятыми список имен групп ("Administrator,User") в одном столбце ("groups")
Правильно ли это, и если да, то зачем создавать отдельную таблицу "Группа"? Так как кажется, что вы можете иметь только один групповой список для каждого логина ("email_address"), не будет ли так же просто добавить столбец с названием "groups" в таблицу "User" и вообще удалить таблицу "Group"?
Спасибо!
1 ответ
Я не уверен, какой материал вы использовали для настройки области JDBC, но он кажется неполным или неправильным. Ниже приведено описание конфигурации, которую я использовал для настройки области JDBC.
Структура базы данных (как операторы DDL):
Таблица ПОЛЬЗОВАТЕЛЕЙ
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;
Фрагмент конфигурации Glassfish JDBCRealm из 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> = ?;
Когда вы рассматриваете структуру второго запроса, совершенно очевидно, что таблица группы должна либо содержать идентификатор пользователя, сопоставленный с идентификатором группы (что приводит к дублированию данных группы для пользователей, сопоставленных с несколькими группами), либо что таблица группы должна быть таблица соединений, которая отображает пользователей в группы.