【问题标题】:GlassFish JDBC Realm Group MembershipGlassFish JDBC 领域组成员资格
【发布时间】:2011-07-24 19:22:39
【问题描述】:

我一直忙于在 GlassFish 3.1 上设置身份验证,特别是 JDBC 领域。我一直在假设:

  • “用户”表包含登录名(“电子邮件地址”)和密码(“密码”)
  • “组”表包含一组组名称(“名称”)
  • “User_Group”表将用户和组匹配起来。

但是,我无法在任何地方配置“User_Group”表,所以我想知道服务器如何能够将用户与组匹配。不用说它没有用。然而,仔细检查表明:

  • “用户”表包含登录名(“电子邮件地址”)和密码(“密码”)
  • “组”表包含登录名(“email_address”)作为主键,并在单列(“组”)

这是正确的吗?如果正确,为什么还要麻烦创建一个单独的“组”表?既然似乎每次登录只能有一个组列表(“email_address”),那么简单地将名为“组”的列添加到“用户”表并完全丢弃“组”表不是很简单吗?

谢谢!

【问题讨论】:

    标签: java jakarta-ee jdbc glassfish


    【解决方案1】:

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

    【讨论】:

    • 感谢一百万个 Vineet,它清除了它!作为参考,我一直在关注这篇文章:link海报提出的数据库是造成混乱的原因。
    • @Laurens,是的,我记得那个帖子;它没有解释如何将用户映射到多个组,并且该帖子中的数据库结构用于 1:1 用户组映射。幸运的是,我使用 Derby 连接池来记录 Glassfish 发出的查询,因此很容易弄清楚发生了什么。
    • GROUPS在这里有什么实际价值吗?当然,可以定义数据库约束以确保USER_GROUPS 中的所有值分别存在于USERGROUPS 中,从而确保数据完整性。这在应用程序中也可能有用。但是在 GlassFish 中,表 GROUPS 根本没有被使用,对吧? (抄送:@Laurens)
    • @Arjan,如果你有一个,JDBCRealm 实现不会对实际的 GROUPS 表执行任何查询。但是,如果单独使用USERUSER_GROUP 表,则可能没有 3NF 数据模型。您的数据模型很可能有任何 GROUP 的其他列。
    • 谢谢,我只是想确保我没有错过重点。 (顺便说一句:Jetty 允许 defining "true" join tables,所以我想知道 GlassFish 是否也有一些隐藏的支持。但是:没有。)
    猜你喜欢
    • 2013-10-22
    • 1970-01-01
    • 2013-01-04
    • 1970-01-01
    • 2016-07-29
    • 2017-04-02
    • 1970-01-01
    • 1970-01-01
    • 2012-03-10
    相关资源
    最近更新 更多