我不确定您在配置 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配置sn-p:
<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,它映射到连接表USERS_GROUPS 的GROUPID 列,而不是组表GROUPS。这是因为 JDBCRealm 发出以下 SQL 语句(如果您反编译 com.sun.enterprise.security.auth.realm.jdbc.JDBCRealm 类):
密码查询,用户 ID 为 DigestLoginModule 传递的参数:
SELECT <passwordColumn> FROM <userTable> WHERE <userNameColumn> = ?
组查询,用户ID作为参数传递:
SELECT <groupNameColumn> FROM <groupTable> WHERE <groupTableUserNameColumn> = ?;
当您考虑第二个查询的结构时,很明显组表必须包含映射到组 ID 的用户 ID(这导致映射到多个组的用户的组数据重复),或者组表必须是将用户映射到组的连接表。