2011-07-24 54 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