GlassFish JDBC领域组成员
我一直忙于在GlassFish 3.1上设置身份validation,特别是JDBC领域。 我一直在假设:
- “用户”表包含登录名(“email_address”)和密码(“密码”)
- “组”表包含组名列表(“名称”)
- “User_Group”表与用户和组匹配。
我无处可配置“User_Group”表,但是我想知道服务器如何能够将用户与组匹配。 不用说它不起作用。 然而,仔细检查表明:
- “用户”表包含登录名(“email_address”)和密码(“密码”)
- “组”表包含登录名(“email_address”) 作为主键 ,以及以逗号分隔的组名列表(“Administrator,User”)在一列中(“组”)
这是正确的,如果是这样,为什么要经历创建单独的“组”表的麻烦? 由于看起来每个登录只能有一个组列表(“email_address”),只是简单地将一个名为“组”的列添加到“用户”表并完全丢弃“组”表就不那么容易了吗?
谢谢!
我不确定您配置JDBC领域的材料是什么,但它看起来不完整或不正确。 以下是我用于配置JDBC领域的配置的描述。
数据库结构(作为DDL语句):
USERS表
CREATE TABLE USERS ( USERID VARCHAR(50) NOT NULL, PASSWORD VARCHAR(128) NOT NULL ); --//@UNDO DROP TABLE USERS;
GROUPS表
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;
来自domain.xml
的Glassfish JDBCRealm配置代码段:
注意, group-name-column
属性的值为GROUPID
,它映射到连接表USERS_GROUPS
的GROUPID
列,而不是组表GROUPS
。 这是因为JDBCRealm发出以下SQL语句(如果您反编译com.sun.enterprise.security.auth.realm.jdbc.JDBCRealm
类):
密码查询,用户Id是从DigestLoginModule传递的参数:
SELECT FROM WHERE = ?
组查询,用户ID作为参数传递:
SELECT FROM WHERE = ?;
当您考虑第二个查询的结构时,很明显组表必须包含映射到组ID的用户ID(这会导致映射到多个组的用户的组数据重复),或者组表必须是将用户映射到组的连接表。