Java GlassFish JDBC领域组成员资格

Java GlassFish JDBC领域组成员资格,java,jakarta-ee,jdbc,glassfish,Java,Jakarta Ee,Jdbc,Glassfish,我一直在忙着在GlassFish 3.1上设置身份验证,特别是JDBC领域。我的经营假设是: “用户”表包含登录名(“电子邮件地址”)和密码(“密码”) “组”表包含组名列表(“名称”) “用户组”表匹配用户和组 然而,我在任何地方都无法配置“User\u Group”表,因此我想知道服务器如何将用户与组匹配起来。不用说,这是行不通的。然而,仔细检查表明: “用户”表包含登录名(“电子邮件地址”)和密码(“密码”) “组”表包含作为主键的登录名(“电子邮件地址”),以及一列(“组”)中以逗

我一直在忙着在GlassFish 3.1上设置身份验证,特别是JDBC领域。我的经营假设是:

  • “用户”表包含登录名(“电子邮件地址”)和密码(“密码”)
  • “组”表包含组名列表(“名称”)
  • “用户组”表匹配用户和组
然而,我在任何地方都无法配置“User\u Group”表,因此我想知道服务器如何将用户与组匹配起来。不用说,这是行不通的。然而,仔细检查表明:

  • “用户”表包含登录名(“电子邮件地址”)和密码(“密码”)
  • “组”表包含作为主键的登录名(“电子邮件地址”),以及一列(“组”)中以逗号分隔的组名列表(“管理员、用户”)
这是正确的吗?如果是,为什么还要费劲创建一个单独的“组”表?既然每个登录名只能有一个grouplist(“email_address”),那么简单地将一个名为“groups”的列添加到“User”表中,然后完全放弃“Group”表不是很容易吗


谢谢

我不确定您在配置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;
CREATE TABLE USERS_GROUPS (
        GROUPID VARCHAR(20) NOT NULL,
        USERID VARCHAR(50) NOT NULL
    );

--//@UNDO

DROP TABLE USERS_GROUPS;
组表

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;
CREATE TABLE USERS_GROUPS (
        GROUPID VARCHAR(20) NOT NULL,
        USERID VARCHAR(50) NOT NULL
    );

--//@UNDO

DROP TABLE USERS_GROUPS;
用户组加入表

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;
CREATE TABLE USERS_GROUPS (
        GROUPID VARCHAR(20) NOT NULL,
        USERID VARCHAR(50) NOT NULL
    );

--//@UNDO

DROP TABLE USERS_GROUPS;

domain.xml
中的Glassfish JDBCRealm配置片段:

    <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>
以用户Id作为参数传递的组查询:

SELECT <groupNameColumn> FROM <groupTable> WHERE <groupTableUserNameColumn> = ?;
从其中选择=?;

当您考虑第二个查询的结构时,很明显,组表必须包含映射到组ID的用户ID(这会导致映射到多个组的用户的组数据重复),或者组表必须是将用户映射到组的连接表。作为参考,我一直在关注这篇文章:海报提议的数据库是造成混乱的原因。@Laurens,是的,我记得那篇文章;它没有解释如何将用户映射到多个组,该文章中的数据库结构是用于1:1用户组映射的。幸运的是,我使用Derby连接池记录Glassfish发出的查询,因此很容易弄清楚发生了什么。表

在这里有实际价值吗?当然,可以定义数据库约束,以确保
用户组
中的所有值分别存在于
用户组
中,从而确保数据完整性。这可能在应用程序中也很有用。但是在GlassFish中,table
group
根本不被使用,对吗?(cc:@Laurens)@Arjan,JDBCRealm实现不会对实际的GROUPS表执行任何查询(如果有)。但是,如果单独使用
USER
USER\u GROUP
表,则可能没有3NF数据模型。您的数据模型很可能有其他列用于任何
。谢谢,我只是想确保我没有遗漏要点。(完全是一个旁白:码头允许,所以我想知道玻璃鱼是否也有一些隐藏的支持。但是:没有。)