我不確定您配置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