2011-07-24 55 views
2

我一直在GlassFish 3.1上忙于设置身份验证(特别是JDBC领域)。我一直在这一假设下运行:GlassFish JDBC领域组成员资格

  • “用户”表中包含登录名(“EMAIL_ADDRESS”)和密码(“密码”)
  • “本集团”表包含组的列表名称(“名称”)
  • “User_Group”表将用户和组匹配起来。

无处我能不过来配置“USER_GROUP”表,所以我被留下想知道如何在服务器将永远是能够匹配用户达集团。毋庸置疑,它不起作用。然而,仔细检查表明:

  • “用户”表中包含登录名(“EMAIL_ADDRESS”)和密码(“密码”)
  • “本集团”表中包含登录名(“EMAIL_ADDRESS” )作为主键,并在单个列(“集团”)

这是正确的,如果是这样,为什么要通过组名的逗号分隔列表(“管理员用户”)创建一个单独的“组”表的麻烦?由于看起来每个登录名只能有一个grouplist(“email_address”),这不就像向“User”表中简单添加一个名为“groups”的列并放弃“Group”表一样简单吗?

谢谢!

回答

9

我不确定您配置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一个值,该值映射到连接表的GROUPIDUSERS_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的用户(其导致映射到多个组的用户的组数据重复),或者组表必须是将用户映射到组的连接表。

+0

感谢百万Vineet,清除它!为了参考,我一直在关注这篇文章:[链接](http://blogs.oracle.com/swchan/entry/jdbcrealm_in_glassfish)海报的建议数据库是造成混淆的原因。 – Laurens

+0

@劳伦斯,是的,我记得那篇文章;它没有解释如何将用户映射到多个组,并且该帖子中的数据库结构是针对1:1用户组映射的。幸运的是,我使用Derby连接池记录了Glassfish发出的查询,因此很容易找出发生的事情。 –

+0

表'GROUPS'在这里有任何实际价值吗?当然,可以定义数据库约束来确保'USER_GROUPS'中的所有值分别存在于'USER'和'GROUPS'中,从而确保数据的完整性。这也可能在应用程序中有用。但在GlassFish中,表“GROUPS”根本就不用,对吧? (cc:@Laurens) – Arjan