我不确定您配置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;
的USER S_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>
笔记,所述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的用户(其导致映射到多个组的用户的组数据重复),或者组表必须是将用户映射到组的连接表。
感谢百万Vineet,清除它!为了参考,我一直在关注这篇文章:[链接](http://blogs.oracle.com/swchan/entry/jdbcrealm_in_glassfish)海报的建议数据库是造成混淆的原因。 – Laurens
@劳伦斯,是的,我记得那篇文章;它没有解释如何将用户映射到多个组,并且该帖子中的数据库结构是针对1:1用户组映射的。幸运的是,我使用Derby连接池记录了Glassfish发出的查询,因此很容易找出发生的事情。 –
表'GROUPS'在这里有任何实际价值吗?当然,可以定义数据库约束来确保'USER_GROUPS'中的所有值分别存在于'USER'和'GROUPS'中,从而确保数据的完整性。这也可能在应用程序中有用。但在GlassFish中,表“GROUPS”根本就不用,对吧? (cc:@Laurens) – Arjan