Членство в 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> = ?;

Когда вы рассматриваете структуру второго запроса, совершенно очевидно, что таблица группы должна либо содержать идентификатор пользователя, сопоставленный с идентификатором группы (что приводит к дублированию данных группы для пользователей, сопоставленных с несколькими группами), либо что таблица группы должна быть таблица соединений, которая отображает пользователей в группы.

Другие вопросы по тегам