GlassFish JDBC领域组成员

Lau*_*ens 2 java jdbc glassfish java-ee

我一直忙于在GlassFish 3.1上设置身份验证,特别是JDBC领域.我一直在假设:

  • "用户"表包含登录名("email_address")和密码("密码")
  • "组"表包含组名列表("名称")
  • "User_Group"表与用户和组匹配.

我无处可配置"User_Group"表,但是我想知道服务器如何能够将用户与组匹配.不用说它没用.然而,仔细检查表明:

  • "用户"表包含登录名("email_address")和密码("密码")
  • "组"表包含登录名("email_address")作为主键,以及以逗号分隔的组名列表("Administrator,User")在一列中("组")

这是正确的,如果是这样,为什么要经历创建单独的"组"表的麻烦?由于看起来每次登录只能有一个组列表("email_address"),只是简单地将一个名为"groups"的列添加到"User"表并完全丢弃"Group"表就不那么容易了吗?

谢谢!

Vin*_*lds 9

我不确定您配置JDBC领域的材料是什么,但它看起来不完整或不正确.以下是我用于配置JDBC领域的配置的描述.


数据库结构(作为DDL语句):

USERS表

CREATE TABLE USERS (
        USERID VARCHAR(50) NOT NULL,
        PASSWORD VARCHAR(128) NOT NULL
    );

--//@UNDO

DROP TABLE USERS;
Run Code Online (Sandbox Code Playgroud)

GROUPS表

CREATE TABLE GROUPS (
        GROUPID VARCHAR(20) NOT NULL
    );

--//@UNDO

DROP TABLE GROUPS;
Run Code Online (Sandbox Code Playgroud)

USERS_GROUPS联接表

CREATE TABLE USERS_GROUPS (
        GROUPID VARCHAR(20) NOT NULL,
        USERID VARCHAR(50) NOT NULL
    );

--//@UNDO

DROP TABLE USERS_GROUPS;
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

注意,该group-name-column属性的值为GROUPID,映射到GROUPID连接表的列USERS_GROUPS而不是组表GROUPS.这是因为JDBCRealm发出以下SQL语句(如果您反编译com.sun.enterprise.security.auth.realm.jdbc.JDBCRealm该类):

密码查询,用户Id是从DigestLoginModule传递的参数:

SELECT <passwordColumn> FROM <userTable> WHERE <userNameColumn> = ?
Run Code Online (Sandbox Code Playgroud)

组查询,用户ID作为参数传递:

SELECT <groupNameColumn> FROM <groupTable> WHERE <groupTableUserNameColumn> = ?;
Run Code Online (Sandbox Code Playgroud)

当您考虑第二个查询的结构时,很明显组表必须包含映射到组ID的用户ID(这会导致映射到多个组的用户的组数据重复),或组表必须是将用户映射到组的连接表.