DataSourceRealm
DataSourceRealm 是 Tomcat Realm 接口的一種實(shí)現(xiàn),它通過(guò)一個(gè) JNDI 命名的 JDBC 數(shù)據(jù)源在關(guān)系型數(shù)據(jù)庫(kù)中查找用戶。只要數(shù)據(jù)庫(kù)結(jié)構(gòu)符合下列要求,你可以通過(guò)大量的配置來(lái)靈活地修改現(xiàn)有的表與列名。
- 必須有一張用戶表(users table)。它包含著一個(gè)由 Realm 所能識(shí)別的所有合法用戶所構(gòu)成的行。
- 用戶表必須至少包含兩列(當(dāng)然,如果現(xiàn)有應(yīng)用確實(shí)需要,則同樣也可以包含更多的列):
- 用戶名: 當(dāng)用戶登錄時(shí),能被 Tomcat 識(shí)別的用戶名。
- 密碼: 當(dāng)用戶登錄時(shí),能被 Tomcat 所識(shí)別的密碼。該列中的值可能是明文,也可能是摘要式密碼,稍后詳述。
- 必須有一張用戶角色表(user roles table)。該表包含一個(gè)角色行,包含著可能指定給特定用戶的每個(gè)合法角色。一個(gè)用戶可以沒(méi)有角色,也可以有一個(gè)或多個(gè)角色,這都是合法的。
- 用戶角色表 至少應(yīng)包含兩列(如果現(xiàn)有應(yīng)用確實(shí)需要,則也可以包含更多的列):
- 用戶名。Tomcat 所能識(shí)別的用戶名(與用戶表中指定的值相同)。
- 用戶所對(duì)應(yīng)的合法角色名。
快速入門(mén)
為了設(shè)置 Tomcat 從而使用 DataSourceRealm,需要執(zhí)行以下步驟:
- 在數(shù)據(jù)庫(kù)中創(chuàng)建符合上述規(guī)范的表與列。
- 配置一個(gè) Tomcat 使用的數(shù)據(jù)庫(kù)用戶名與密碼,并且至少有只讀權(quán)限(Tomcat 永遠(yuǎn)都不會(huì)去修改那些表中的數(shù)據(jù))。
- 為數(shù)據(jù)庫(kù)配置一個(gè) JNDI 命名的 JDBC DataSource。詳情可參考JNDI DataSource Example HOW-TO》應(yīng)該鏈接至相應(yīng)中文頁(yè)面》。
- 在 $CATALINA_BASE/conf/server.xml 目錄中設(shè)置一個(gè) 元素。這一點(diǎn)下文將會(huì)詳細(xì)敘述。
- 如果 Tomcat 處于運(yùn)行狀態(tài),則重啟它。
范例
下面這個(gè) SQL 腳本范例創(chuàng)建了我們所需的表(根據(jù)你所用的數(shù)據(jù)庫(kù),可以相應(yīng)修改其中的語(yǔ)法)。
create table users (
user_name varchar(15) not null primary key,
user_pass varchar(15) not null
);
create table user_roles (
user_name varchar(15) not null,
role_name varchar(15) not null,
primary key (user_name, role_name)
);
在下面的范例中,有一個(gè)名為 authority 的 MySQL 數(shù)據(jù)庫(kù),它包含上述創(chuàng)建的表,通過(guò)名為 “java:/comp/env/jdbc/authority” 的 JNDI 命名的 JDBC 數(shù)據(jù)源來(lái)訪問(wèn)。
<Realm className="org.apache.catalina.realm.DataSourceRealm"
dataSourceName="jdbc/authority"
userTable="users" userNameCol="user_name" userCredCol="user_pass"
userRoleTable="user_roles" roleNameCol="role_name"/>
特別注意事項(xiàng)
使用 DataSourceRealm 時(shí)必須遵守下列規(guī)則:
- 當(dāng)用戶首次訪問(wèn)一個(gè)受保護(hù)資源時(shí),Tomcat 會(huì)調(diào)用這一 Realm 的 authenticate() 方法,從而使任何對(duì)數(shù)據(jù)庫(kù)的即時(shí)修改(新用戶、密碼或角色改變,等等)都能立即生效。
- 一旦用戶認(rèn)證成功,在登錄后,該用戶(及其相應(yīng)角色)就將緩存在 Tomcat 中。(對(duì)于以表單形式的認(rèn)證,這意味著直到會(huì)話超時(shí)或者無(wú)效才會(huì)過(guò)期;對(duì)于基本形式的驗(yàn)證,意味著直到用戶關(guān)閉瀏覽器才會(huì)過(guò)期。)在會(huì)話序列化期間不會(huì)保存或重置緩存的用戶。對(duì)已認(rèn)證用戶的數(shù)據(jù)庫(kù)信息進(jìn)行的任何改動(dòng)都不會(huì)生效,直到該用戶下次登錄。
應(yīng)用負(fù)責(zé)管理users(用戶表)和user roles(用戶角色表)中的信息。Tomcat 沒(méi)有提供任何內(nèi)置功能來(lái)維護(hù)這兩種表。