我不确定配置JDBC领域需要遵循哪些内容,但是它似乎不完整或不正确。以下是我用来配置JDBC领域的配置的描述。
数据库结构(作为DDL语句):
USERS表
CREATE TABLE USERS ( USERID VARCHAr(50) NOT NULL, PASSWORD VARCHAr(128) NOT NULL );--//@UNDODROp TABLE USERS;
GROUPS表
CREATE TABLE GROUPS ( GROUPID VARCHAr(20) NOT NULL );--//@UNDODROP TABLE GROUPS;
USERS_GROUPS连接表
CREATE TABLE USERS_GROUPS ( GROUPID VARCHAr(20) NOT NULL, USERID VARCHAr(50) NOT NULL );--//@UNDODROP 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该类):
密码查询,其中用户ID是从DigestLoginModule传递的参数:
SELECT <passwordColumn> FROM <userTable> WHERe <userNameColumn> = ?
组查询,以用户ID作为参数传递:
SELECt <groupNameColumn> FROM <groupTable> WHERe <groupTableUserNameColumn> = ?;
考虑第二个查询的结构时,很显然组表必须包含映射到组ID的用户ID(这导致映射到多个组的用户的组数据重复),或者组表必须是将用户映射到组的联接表。



