Realm 配置
快速入門
本文檔介紹了如何借助一個(gè)“數(shù)據(jù)庫(kù)”來(lái)配置 Tomcat ,從而實(shí)現(xiàn)容器管理安全性。所要連接的這種數(shù)據(jù)庫(kù)含有用戶名、密碼以及用戶角色。你只需知道的是,如果使用的 Web 應(yīng)用含有一個(gè)或多個(gè)?<security-constraint>?元素,<login-config>?元素定義了用戶驗(yàn)證的必需細(xì)節(jié)信息。如果你不打算使用這些功能,則可以忽略這篇文檔。
關(guān)于容器管理安全性的基礎(chǔ)知識(shí),可參考?Servlet Specification (Version 2.4)?中的第 12 節(jié)內(nèi)容。
關(guān)于如何使用 Tomcat 中的單點(diǎn)登錄(用戶只需驗(yàn)證一次,就能夠登錄一個(gè)虛擬主機(jī)的所有 Web 應(yīng)用)功能,請(qǐng)參看該文檔。
概述
什么是 Realm
Realm(安全域)其實(shí)就是一個(gè)存儲(chǔ)用戶名和密碼的“數(shù)據(jù)庫(kù)”再加上一個(gè)枚舉列表。“數(shù)據(jù)庫(kù)”中的用戶名和密碼是用來(lái)驗(yàn)證 Web 應(yīng)用(或 Web 應(yīng)用集合)用戶合法性的,而每一合法用戶所對(duì)應(yīng)的角色存儲(chǔ)在枚舉列表中。可以把這些角色看成是類似 UNIX 系統(tǒng)中的 group(分組),因?yàn)橹挥心軌驌碛刑囟ń巧挠脩舨拍茉L問(wèn)特定的 Web 應(yīng)用資源(而不是通過(guò)對(duì)用戶名列表進(jìn)行枚舉適配)。特定用戶的用戶名下可以配置多個(gè)角色。
雖然 Servlet 規(guī)范描述了一個(gè)可移植機(jī)制,使應(yīng)用可以在?web.xml?部署描述符中聲明它們的安全需求,但卻沒(méi)有提供一種可移植 API 來(lái)定義出 Servlet 容器與相應(yīng)用戶及角色信息的接口。然而,在很多情況下,非常適于將 Servlet 容器與一些已有的驗(yàn)證數(shù)據(jù)庫(kù)或者生產(chǎn)環(huán)境中已存在的機(jī)制“連接”起來(lái)。因此,Tomcat 定義了一個(gè) Java 接口(org.apache.catalina.Realm),通過(guò)“插入”組件來(lái)建立連接。提供了 6 種標(biāo)準(zhǔn)插件,支持與各種驗(yàn)證信息源的連接:
- JDBCRealm——通過(guò) JDBC 驅(qū)動(dòng)器來(lái)訪問(wèn)保存在關(guān)系型數(shù)據(jù)庫(kù)中的驗(yàn)證信息。
- DataSourceRealm——訪問(wèn)保存在關(guān)系型數(shù)據(jù)庫(kù)中的驗(yàn)證信息。
- JNDIRealm——訪問(wèn)保存在 LDAP 目錄服務(wù)器中的驗(yàn)證信息。
- UserDatabaseRealm——訪問(wèn)存儲(chǔ)在一個(gè) UserDatabase JNDI 數(shù)據(jù)源中的認(rèn)證信息,通常依賴一個(gè) XML 文檔(conf/tomcat-users.xml)。
- MemoryRealm——訪問(wèn)存儲(chǔ)在一個(gè)內(nèi)存中對(duì)象集合中的認(rèn)證信息,通過(guò) XML 文檔初始化(conf/tomcat-users.xml)。
- JAASRealm——通過(guò) Java 認(rèn)證與授權(quán)服務(wù)(JAAS)架構(gòu)來(lái)獲取認(rèn)證信息。
另外,還可以編寫自定義?Realm?實(shí)現(xiàn),將其整合到 Tomcat 中,只需這樣做:
- 實(shí)現(xiàn)?org.apache.catalina.Realm?接口。
- 將編譯好的 realm 放到 $CATALINA_HOME/lib 中。
- 聲明自定義 realm,具體方法詳見(jiàn)“配置 Realm”一節(jié)。
- 在 MBeans 描述符文件中聲明自定義realm。
配置 Realm
在詳細(xì)介紹標(biāo)準(zhǔn) Realm 實(shí)現(xiàn)之前,簡(jiǎn)要了解 Realm 的配置方式是很關(guān)鍵的一步。大體來(lái)說(shuō),就是需要在conf/server.xml?配置文件中添加一個(gè) XML 元素,如下所示:
<Realm className="... class name for this implementation"... other attributes for this implementation .../><Realm>?可以嵌入以下任何一種?Container?元素中。Realm 元素的位置至關(guān)重要,它會(huì)對(duì) Realm 的“范圍”(比如說(shuō)哪個(gè) Web 應(yīng)用能夠共享同一驗(yàn)證信息)有直接的影響。
- <Engine>?元素?內(nèi)嵌入該元素中的這種 Realm 元素可以被所有虛擬主機(jī)上的所有?Web 應(yīng)用所共享,除非該 Realm 元素被內(nèi)嵌入下屬?<Host>?或?<Context>?元素的 Realm 元素所覆蓋。
- <Host>?元素?內(nèi)嵌入該元素中的這種 Realm 元素可以被這一虛擬主機(jī)上的所有?Web 應(yīng)用所共享。除非該 Realm 元素被內(nèi)嵌入下屬?<Context>?元素的 Realm 元素所覆蓋。
- <Context>?元素?內(nèi)嵌入該元素中的這種 Realm 元素只能被這一 Web 應(yīng)用所使用。
常用特性
摘要式密碼
對(duì)于每種標(biāo)準(zhǔn)?Realm?實(shí)現(xiàn)來(lái)說(shuō),用戶的密碼默認(rèn)都是以明文方式保存的。在很多情況下,這種方式都非常糟糕,即使是一般的用戶也能收集到足夠的驗(yàn)證信息,從而以其他用戶的信息成功登錄。為了避免這種情況的發(fā)生,標(biāo)準(zhǔn)?Realm?實(shí)現(xiàn)支持一種對(duì)用戶密碼進(jìn)行摘要式處理的機(jī)制,它能以無(wú)法輕易破解的形式對(duì)存儲(chǔ)的密碼進(jìn)行加密處理,同時(shí)保證Realm?實(shí)現(xiàn)仍能使用這種加密后的密碼進(jìn)行驗(yàn)證。
在標(biāo)準(zhǔn)的 Realm 驗(yàn)證時(shí),會(huì)將存儲(chǔ)的密碼與用戶所提供的密碼進(jìn)行比對(duì),這時(shí),我們可以通過(guò)指定?<Realm>?元素中的?digest?屬性來(lái)選擇摘要式密碼。該屬性值必須是一種java.security.MessageDigest?類所支持的摘要式算法(SHA、MD2、或 MD5)。當(dāng)你選擇該屬性值時(shí),存儲(chǔ)在 Realm 中的密碼內(nèi)容必須是明文格式,隨后它將被你所指定的算法進(jìn)行摘要式加密。
在調(diào)用 Realm 的?authenticate()?方法后,用戶所提供的明文密碼同樣也會(huì)利用上述你所指定的加密算法進(jìn)行加密,加密結(jié)果與 Realm 的返回值相比較。如果兩者相等,則表明原始密碼的明文形式更用戶所提供的密碼完全等同,因此該用戶身份驗(yàn)證成功。
可以采用以下兩種比較便利的方法來(lái)計(jì)算明文密碼的摘要值:
- 如果應(yīng)用需要?jiǎng)討B(tài)計(jì)算摘要式密碼,調(diào)用?org.apache.catalina.realm.RealmBase?類的靜態(tài)?Digest()?方法,傳入明文密碼和摘要式算法名稱及字符編碼方案。該方法返回摘要式密碼。
- 如果想執(zhí)行命令行工具來(lái)計(jì)算摘要式密碼,只需執(zhí)行:
CATALINA_HOME/bin/digest.[bat|sh] -a {algorithm} {cleartext-password}
標(biāo)準(zhǔn)輸出將返回明文密碼的摘要式形式。
如果使用 DIGEST 驗(yàn)證的摘要式密碼,用來(lái)生成摘要密碼的明文密碼則將有所不同,而且必須使用一次不加鹽的 MD5 算法。對(duì)應(yīng)到上面的范例,那就是必須把?{cleartext-password}?替換成?{username}:{realm}:{cleartext-password}。再比如說(shuō),在一個(gè)開(kāi)發(fā)環(huán)境中,可能采用這種形式:testUser:Authentication required:testPassword。{realm}?的值取自 Web 應(yīng)用?<login-config>?的?<realm-name>?元素。如果沒(méi)有在 web.xml 中指定,則使用默認(rèn)的Authentication required。
若要使用非平臺(tái)默認(rèn)編碼的用戶名和(或)密碼,則命令如下:
CATALINA_HOME/bin/digest.[bat|sh] -a {algorithm} -e {encoding} {input}
但需要注意的是,一定要確保輸入正確地傳入摘要。摘要返回?{input}:{digest}。如果輸入在返回時(shí)出現(xiàn)損壞,摘要?jiǎng)t將無(wú)效。
摘要的輸出格式為?{salt}${iterations}${digest}。如果鹽的長(zhǎng)度為 0,迭代次數(shù)為 1,則輸出將簡(jiǎn)化為?{digest}。
CATALINA_HOME/bin/digest.[bat|sh]?的完整格式如下:
CATALINA_HOME/bin/digest.[bat|sh] [-a <algorithm>] [-e <encoding>][-i <iterations>] [-s <salt-length>] [-k <key-length>][-h <handler-class-name>] <credentials>- -a?用來(lái)生成存儲(chǔ)憑證的算法。如未指定,將使用憑證處理器(CredentialHandler)的默認(rèn)值,如果認(rèn)證處理器和算法均未指定,則使用默認(rèn)值?SHA-512。
- -e?指定用于任何必要的字節(jié)與字符間轉(zhuǎn)換的字符編碼方案。如未指定,使用系統(tǒng)默認(rèn)的字符編碼方案?Charset#defaultCharset()。
- -i?生成存儲(chǔ)的憑證時(shí)所使用的迭代次數(shù)。如未指定,使用 CredentialHandler 的默認(rèn)值。
- -s?生成并存儲(chǔ)到認(rèn)證中的鹽的長(zhǎng)度(字節(jié))。如未指定,使用 CredentialHandler 的默認(rèn)值。
- -k?(生成憑證時(shí),如果隨帶創(chuàng)建了)鍵的長(zhǎng)度(位)。如未指定,則使用 CredentialHandler 的默認(rèn)值
- -h?CredentialHandler 使用的完整類名。如未指定,則輪流使用內(nèi)建的憑證處理器(MessageDigestCredentialHandler,然后是?SecretKeyCredentialHandler),將使用第一個(gè)接受指定算法的憑證處理器。
范例應(yīng)用
Tomcat 自帶的范例應(yīng)用中包含一個(gè)受到安全限制保護(hù)的區(qū)域,使用表單式登錄方式。為了訪問(wèn)它,在你的瀏覽器地址欄中輸入?http://localhost:8080/examples/jsp/security/protected/,并使用?UserDatabaseRealm?默認(rèn)的用戶名和密碼進(jìn)行登錄。
Manager 應(yīng)用
如果你希望使用 Manager 應(yīng)用在一個(gè)運(yùn)行的 Tomcat 安裝上來(lái)部署或取消部署 Web 應(yīng)用,那么必須在一個(gè)選定的 Realm 實(shí)現(xiàn)上,將?manager-gui?角色添加到至少一個(gè)用戶名上。這是因?yàn)?Manager 自身使用一個(gè)安全限制,要想在該應(yīng)用的 HTML 界面中訪問(wèn)請(qǐng)求 URI,就必須要有 manager-gui 角色。
出于安全性考慮,默認(rèn)情況下,Realm 中的用戶名(比如使用?conf/tomcat-users.xml)沒(méi)有被分配 manager-gui 角色。因此,用戶起初無(wú)法使用這個(gè)功能,除非 Tomcat 管理員特意將這一角色分配給他們。
Realm 日志
Realm 的容器(Context、Host 及 Engine)所對(duì)應(yīng)的日志配置文件將記錄?Realm?所記錄下的調(diào)試和異常信息。
標(biāo)準(zhǔn) Realm 實(shí)現(xiàn)
JDBCRealm
簡(jiǎn)介
JDBCRealm?是 Tomcat?Realm?接口的一種實(shí)現(xiàn),它通過(guò) JDBC 驅(qū)動(dòng)程序在關(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)的合法角色名。
快速入門
為了設(shè)置 Tomcat 從而使用 JDBCRealm,需要執(zhí)行以下步驟:
Realm 元素屬性
如上所述,為了配置 JDBCRealm,需要?jiǎng)?chuàng)建一個(gè)?Realm?元素,并把它放在?$CATALINA_BASE/conf/server.xml?文件中。JDBCRealm 的屬性都定義在?Realm?配置文檔中。
范例
下面這個(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) );Realm?元素包含在默認(rèn)的?$CATALINA_BASE/conf/server.xml?文件中(被注釋掉了)。在下面的范例中,有一個(gè)名為 authority 的數(shù)據(jù)庫(kù),它包含上述創(chuàng)建的表,通過(guò)用戶名“dbuser”和密碼“dbpass”進(jìn)行訪問(wèn)。
<Realm className="org.apache.catalina.realm.JDBCRealm"driverName="org.gjt.mm.mysql.Driver"connectionURL="jdbc:mysql://localhost/authority?user=dbuser&password=dbpass"userTable="users" userNameCol="user_name" userCredCol="user_pass"userRoleTable="user_roles" roleNameCol="role_name"/>特別注意事項(xiàng)
JDBCRealm 必須遵循以下規(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ù)這兩種表。
DataSourceRealm
簡(jiǎn)介
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)的合法角色名。
快速入門
為了設(shè)置 Tomcat 從而使用 DataSourceRealm,需要執(zhí)行以下步驟:
范例
下面這個(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ù)這兩種表。
JNDIRealm
簡(jiǎn)介
JNDIRealm?是 Tomcat?Realm?接口的一種實(shí)現(xiàn),通過(guò)一個(gè) JNDI 提供者1在 LDAP 目錄服務(wù)器中查找用戶。realm 支持大量的方法來(lái)使用認(rèn)證目錄。
通常是可以使用 JNDI API 類的標(biāo)準(zhǔn) LDAP 提供者。
a. 連接目錄
realm 與目錄服務(wù)器的連接是通過(guò)?connectionURL?配置屬性來(lái)定義的。這個(gè) URL 的格式是通過(guò) JNDI 提供者來(lái)定義的。它通常是個(gè) LDAP URL,指定了所要連接的目錄服務(wù)器的域名,另外還(可選擇)指定了所需的根命名上下文的端口和唯一名稱(DN)。
如果有多個(gè)提供者,則可以配置?alternateURL。如果一個(gè)套接字連接無(wú)法傳遞給提供者?connectionURL,則會(huì)換用?alternateURL。
當(dāng)通過(guò)創(chuàng)建連接來(lái)搜索目錄,獲取用戶及角色信息時(shí),realm 會(huì)利用?connectionName?和?connectionPassword?這兩個(gè)屬性所指定的用戶名和密碼在目錄上進(jìn)行自我認(rèn)證。如果未指定這兩個(gè)屬性,則創(chuàng)立的連接是匿名連接,這種連接適用于大多數(shù)情況。
b. 選擇用戶目錄項(xiàng)
在目錄中,每個(gè)可被認(rèn)證的用戶都必須表示為獨(dú)立的項(xiàng),這種獨(dú)立項(xiàng)對(duì)應(yīng)著由屬性?connectionURL?定義的初始?DirContext?中的元素。這種用戶項(xiàng)必須有一個(gè)包含認(rèn)證所需用戶名的屬性。
每個(gè)用戶項(xiàng)的唯一性名稱(DN)通常含有用于認(rèn)證的用戶名。在這種情況下,userPattern?屬性可以用來(lái)指定 DN,其中的?{0}?代表用戶名應(yīng)該被替換的位置。
realm 必須搜索目錄來(lái)尋找一個(gè)包含用戶名的唯一項(xiàng),可用下列屬性來(lái)配置搜索:
- userBase?用戶子樹的基準(zhǔn)項(xiàng)。如果未指定,則搜索基準(zhǔn)為頂級(jí)元素。
- userSubtree?用戶子樹,也就是搜索范圍。如果希望搜索以u(píng)serBase?項(xiàng)為基準(zhǔn)的整個(gè)子樹,則使用?true;默認(rèn)值為?false,只對(duì)頂級(jí)元素進(jìn)行搜索。
- userSearch?指定替代用戶名之后所使用的 LDAP 搜索過(guò)濾器的模式。
c. 用戶認(rèn)證
-
綁定模式
默認(rèn)情況下,realm 會(huì)利用用戶項(xiàng)的 DN 與用戶所提供的密碼,將用戶綁定到目錄上。如果成功執(zhí)行了這種簡(jiǎn)單的綁定,那么就可以認(rèn)為用戶認(rèn)證成功。
出于安全考慮,目錄可能保存的是用戶的摘要式密碼,而非明文密碼(參看摘要式密碼以獲知詳情)。在這種情況下,在綁定過(guò)程中,目錄會(huì)自動(dòng)將用戶所提供的明文密碼加密為正確的摘要式密碼,以便后續(xù)和存儲(chǔ)的摘要式密碼進(jìn)行比對(duì)。然而在綁定過(guò)程中,realm 并不參與處理摘要式密碼。不會(huì)用到?digest?屬性,如果設(shè)置了該屬性,也會(huì)被自動(dòng)忽略。
-
對(duì)比模式
另外一種方法是,realm 從目錄中獲取存儲(chǔ)的密碼,然后將其與用戶所提供的值進(jìn)行比對(duì)。配置方法是,在包含密碼的用戶項(xiàng)中,將?userPassword?屬性設(shè)為目錄屬性名。
對(duì)比模式的缺點(diǎn)在于:首先,connectionName?和?connectionPassword?屬性必須配置成允許 realm 讀取目錄中的用戶密碼。出于安全考慮,這是一種不可取的做法。事實(shí)上,很多目錄實(shí)現(xiàn)甚至都不允許目錄管理器讀取密碼。其次,realm 必須自己處理摘要式密碼,包括要設(shè)置所使用的具體算法、在目錄中表示密碼散列值的方式。但是,realm 可能有時(shí)又要訪問(wèn)存儲(chǔ)的密碼,比如為了支持 HTTP 摘要式訪問(wèn)認(rèn)證(HTTP Digest Access Authentication,RFC 2069)。(注意,HTTP 摘要式訪問(wèn)認(rèn)證不同于之前討論過(guò)的在庫(kù)中存儲(chǔ)密碼摘要的方式。)
d. 賦予用戶角色
Realm 支持兩種方法來(lái)表示目錄中的角色:
-
將角色顯式表示為目錄項(xiàng)
通過(guò)明確的目錄項(xiàng)來(lái)表示角色。角色項(xiàng)通常是一個(gè) LDAP 分組項(xiàng),該分組項(xiàng)的一個(gè)屬性包含角色名稱,另一屬性值則是擁有該角色的用戶的 DN 名或用戶名。下列屬性配置了一個(gè)目錄搜索來(lái)尋找與認(rèn)證用戶相關(guān)的角色名。
- roleBase?角色搜索的基準(zhǔn)項(xiàng)。如未指定,則基準(zhǔn)項(xiàng)為頂級(jí)目錄上下文。
- roleSubtree?搜索范圍。如果希望搜索以?roleBase?為基準(zhǔn)項(xiàng)的整個(gè)子樹,則設(shè)為?true。默認(rèn)值為?false,請(qǐng)求一個(gè)只包含頂級(jí)元素的單一搜索。
- roleSearch?用于選擇角色項(xiàng)的 LDAP 搜索過(guò)濾器。它還可以(可選擇)包含用于唯一名稱的模式替換?{0}、用戶名的模式替換?{1},以及用戶目錄項(xiàng)屬性的模式替換?{2}。使用?userRoleAttribute?來(lái)指定提供?{2}?值的屬性名。
- roleName?包含角色名稱的角色項(xiàng)屬性。
- roleNested?啟用內(nèi)嵌角色。如果希望在角色中內(nèi)嵌角色,則設(shè)為?true。如果配置了該屬性,每一個(gè)新近找到的 roleName 和 DN 都將用于遞歸式的新角色搜索。默認(rèn)值為?false。
-
將角色表示為用戶項(xiàng)屬性
將角色名稱保存為用戶目錄項(xiàng)中的一個(gè)屬性值。使用?userRoleName?來(lái)指定該屬性名稱。
當(dāng)然,也可以綜合使用這兩種方法來(lái)表示角色。
快速入門
為了配置 Tomcat 使用 JNDIRealm,需要下列步驟:
Realm 元素屬性
如上所述,為了配置 JDBCRealm,需要?jiǎng)?chuàng)建一個(gè)?Realm?元素,并把它放在?$CATALINA_BASE/conf/server.xml?文件中。JDBCRealm 的屬性都定義在?Realm?配置文檔中。
范例
在目錄服務(wù)器上創(chuàng)建適合的模式超出了本文檔的講解范圍,因?yàn)檫@是跟每個(gè)目錄服務(wù)器的實(shí)現(xiàn)密切相關(guān)的。在下面的實(shí)例中,我們將假定使用的是 OpenLDAP 目錄服務(wù)器的一個(gè)分發(fā)版(2.0.11 版或更新版本,可從http://www.openldap.org處下載)。假設(shè)?slapd.conf?文件包含下列設(shè)置(除了其他設(shè)置之外)。
database ldbm suffix dc="mycompany",dc="com" rootdn "cn=Manager,dc=mycompany,dc=com" rootpw secret我們還假定?connectionURL,使目錄服務(wù)器與 Tomcat 運(yùn)行在同一臺(tái)機(jī)器上。要想了解如何配置及使用 JNDI LDAP 提供者的詳細(xì)信息,請(qǐng)參看?http://docs.oracle.com/javase/7/docs/technotes/guides/jndi/index.html。
接下來(lái),假定利用如下所示的元素(以 LDIF 格式)來(lái)填充目錄服務(wù)器。
# Define top-level entry dn: dc=mycompany,dc=com objectClass: dcObject dc:mycompany# Define an entry to contain people # searches for users are based on this entry dn: ou=people,dc=mycompany,dc=com objectClass: organizationalUnit ou: people# Define a user entry for Janet Jones dn: uid=jjones,ou=people,dc=mycompany,dc=com objectClass: inetOrgPerson uid: jjones sn: jones cn: janet jones mail: j.jones@mycompany.com userPassword: janet# Define a user entry for Fred Bloggs dn: uid=fbloggs,ou=people,dc=mycompany,dc=com objectClass: inetOrgPerson uid: fbloggs sn: bloggs cn: fred bloggs mail: f.bloggs@mycompany.com userPassword: fred# Define an entry to contain LDAP groups # searches for roles are based on this entry dn: ou=groups,dc=mycompany,dc=com objectClass: organizationalUnit ou: groups# Define an entry for the "tomcat" role dn: cn=tomcat,ou=groups,dc=mycompany,dc=com objectClass: groupOfUniqueNames cn: tomcat uniqueMember: uid=jjones,ou=people,dc=mycompany,dc=com uniqueMember: uid=fbloggs,ou=people,dc=mycompany,dc=com# Define an entry for the "role1" role dn: cn=role1,ou=groups,dc=mycompany,dc=com objectClass: groupOfUniqueNames cn: role1 uniqueMember: uid=fbloggs,ou=people,dc=mycompany,dc=comOpenLDAP 服務(wù)器。假定用戶使用他們的 uid(比如說(shuō) jjones)登錄應(yīng)用,匿名連接已經(jīng)足夠可以搜索目錄并獲取角色信息了:
<Realm className="org.apache.catalina.realm.JNDIRealm"connectionURL="ldap://localhost:389"userPattern="uid={0},ou=people,dc=mycompany,dc=com"roleBase="ou=groups,dc=mycompany,dc=com"roleName="cn"roleSearch="(uniqueMember={0})" />利用這種配置,通過(guò)在?userPattern?替換用戶名,realm 能夠確定用戶的 DN,然后利用這個(gè) DN 和取自用戶的密碼將用戶綁定到目錄中,從而驗(yàn)證用戶身份,然后搜索整個(gè)目錄服務(wù)器來(lái)找尋用戶角色。
現(xiàn)在假定希望用戶輸入電子郵件地址(而不是用戶 id)。在這種情況下,realm 必須搜索目錄找到用戶項(xiàng)。當(dāng)用戶項(xiàng)被保存在多個(gè)子樹中,而這些子樹可能分別對(duì)應(yīng)不同的組織單位或企業(yè)位置時(shí),可能必須執(zhí)行一個(gè)搜索。
另外,假設(shè)除了分組項(xiàng)之外,你還想用用戶項(xiàng)的屬性來(lái)保存角色,那么在這種情況下,Janet Jones 對(duì)應(yīng)的項(xiàng)可能如下所示:
dn: uid=jjones,ou=people,dc=mycompany,dc=com objectClass: inetOrgPerson uid: jjones sn: jones cn: janet jones mail: j.jones@mycompany.com memberOf: role2 memberOf: role3 userPassword: janet這個(gè) realm 配置必須滿足以下新要求:
<Realm className="org.apache.catalina.realm.JNDIRealm"connectionURL="ldap://localhost:389"userBase="ou=people,dc=mycompany,dc=com"userSearch="(mail={0})"userRoleName="memberOf"roleBase="ou=groups,dc=mycompany,dc=com"roleName="cn"roleSearch="(uniqueMember={0})" />當(dāng) Janet Jones 用她的電子郵件?j.jones@mycompany.com?登錄時(shí),realm 會(huì)搜索目錄,尋找?guī)в性撾娻]值的唯一項(xiàng),并嘗試?yán)媒o定密碼來(lái)綁定到目錄:uid=jjones,ou=people,dc=mycompany,dc=com。如果驗(yàn)證成功,該用戶將被賦予以下三個(gè)角色:"role2" 與 "role3",她的目錄項(xiàng)中的?memberOf?屬性值;"tomcat",她作為成員存在的唯一分組項(xiàng)中的?cn?屬性值。
最后,為了驗(yàn)證用戶,我們必須從目錄中獲取密碼并在 realm 中執(zhí)行本地比對(duì),將 realm 按照如下方式來(lái)配置:
<Realm className="org.apache.catalina.realm.JNDIRealm"connectionName="cn=Manager,dc=mycompany,dc=com" connectionPassword="secret"connectionURL="ldap://localhost:389"userPassword="userPassword"userPattern="uid={0},ou=people,dc=mycompany,dc=com"roleBase="ou=groups,dc=mycompany,dc=com"roleName="cn"roleSearch="(uniqueMember={0})" />但是,正如之前所討論的那樣,往往應(yīng)該優(yōu)先考慮默認(rèn)的綁定模式。
特別注意事項(xiàng)
使用 JNDIRealm 需要遵循以下規(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ù)這兩種表。
UserDatabaseRealm
UserDatabaseRealm?是 Tomcat?Realm?接口的一種實(shí)現(xiàn),使用 JNDI 資源來(lái)存儲(chǔ)用戶信息。默認(rèn),JNDI 資源是通過(guò)一個(gè) XML 文件來(lái)提供支持的。它并不是針對(duì)大規(guī)模生產(chǎn)環(huán)境用途而設(shè)計(jì)的。在啟動(dòng)時(shí),UserDatabaseRealm 會(huì)從一個(gè) XML 文檔中加載所有用戶以及他們角色的信息(該 XML 文檔默認(rèn)位于?$CATALINA_BASE/conf/tomcat-users.xml。)用戶、密碼以及相應(yīng)角色通常可利用 JMX 進(jìn)行動(dòng)態(tài)編輯,更改結(jié)果會(huì)加以保存并立刻反映在 XML 文檔中。
Realm 元素屬性
跟之前討論的一樣,為了配置 UserDatabaseRealm,需要在?$CATALINA_BASE/conf/server.xml?中創(chuàng)建?<Realm>?元素。關(guān)于 UserDatabaseRealm 中的屬性定義可參看?Realm 配置文檔。
用戶文件格式
用戶文件使用的格式與?MemoryRealm所使用的相同。
范例
默認(rèn)的 Tomcat 安裝已經(jīng)配置了內(nèi)嵌在?<Engine>?元素中的 UserDatabaseRealm,因而可以將其應(yīng)用于所有的虛擬主機(jī)和 Web 應(yīng)用中。默認(rèn)的?conf/tomcat-users.xml?文件內(nèi)容為:
<tomcat-users><user username="tomcat" password="tomcat" roles="tomcat" /><user username="role1" password="tomcat" roles="role1" /><user username="both" password="tomcat" roles="tomcat,role1" /> </tomcat-users>特別注意事項(xiàng)
使用 UserDatabaseRealm 需要遵循以下規(guī)則:
- 當(dāng) Tomcat 首次啟動(dòng)時(shí),它會(huì)從用戶文件中加載所有已定義的用戶及其相關(guān)信息。假如對(duì)該用戶文件中的數(shù)據(jù)進(jìn)行修改,則只有重啟 Tomcat 后才能生效。這些修改并不是通過(guò) UserDatabase 數(shù)據(jù)源來(lái)完成的,是由 Tomcat 所提供的通過(guò) JMX 訪問(wèn)的 MBean 來(lái)實(shí)現(xiàn)的。
- 當(dāng)用戶首次訪問(wèn)一個(gè)受保護(hù)資源時(shí),Tomcat 會(huì)調(diào)用這一?Realm?的?authenticate()?方法。
- 一旦用戶認(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ì)生效,直到該用戶下次登錄。
MemoryRealm
簡(jiǎn)介
MemoryRealm?是一種對(duì) Tomcat 的 Realm 接口的簡(jiǎn)單演示實(shí)現(xiàn),并不是針對(duì)生產(chǎn)環(huán)境而設(shè)計(jì)的。在啟動(dòng)時(shí),MemoryRealm 會(huì)從 XML 文檔中加載所有的用戶信息及其相關(guān)的角色信息(默認(rèn)該文檔位于?$CATALINA_BASE/conf/tomcat-users.xml)。只有重啟 Tomcat 才能使對(duì)該文件作出的修改生效。
Realm 元素屬性
跟之前討論的一樣,為了配置 MemoryRealm,需要在?$CATALINA_BASE/conf/server.xml?中創(chuàng)建?<Realm>?元素。關(guān)于 MemoryRealm 中的屬性定義可參看?Realm 配置文檔。
用戶文件格式
用戶文件包含下列屬性。默認(rèn)情況下,conf/tomcat-users.xml?必須是一個(gè) XML 文件,并且?guī)в幸粋€(gè)根元素:<tomcat-users>。每一個(gè)有效用戶都有一個(gè)內(nèi)嵌在根元素中的?<user>?元素。
- name?用戶登錄所用的用戶名。
- password?用戶登錄所用的密碼。如果?<Realm>?元素中沒(méi)有設(shè)置?digest?屬性,則采用明文密碼,否則就設(shè)置為摘要式密碼,如之前討論的那樣。
- roles?以逗號(hào)分隔的用戶角色名列表。
特別注意事項(xiàng)
使用 MemoryRealm 需要注意以下規(guī)則:
- 當(dāng) Tomcat 首次啟動(dòng)時(shí),它會(huì)從用戶文件中加載所有已定義的用戶及其相關(guān)信息。假如對(duì)該用戶文件中的數(shù)據(jù)進(jìn)行修改,則只有重啟 Tomcat 后才能生效。
- 當(dāng)用戶首次訪問(wèn)一個(gè)受保護(hù)資源時(shí),Tomcat 會(huì)調(diào)用這一?Realm?的?authenticate()?方法。
- 一旦用戶認(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ù)這兩種表。
JAASRealm
簡(jiǎn)介
JAASRealm?是 Tomcat 的?Realm?接口的一種實(shí)現(xiàn),通過(guò) Java Authentication & Authorization Service(JAAS,Java身份驗(yàn)證與授權(quán)服務(wù))架構(gòu)來(lái)實(shí)現(xiàn)對(duì)用戶身份的驗(yàn)證。JAAS 架構(gòu)現(xiàn)已加入到標(biāo)準(zhǔn)的 Java SE API 中。
通過(guò) JAASRealm,開(kāi)發(fā)者實(shí)際上可以將任何安全的 Realm 與 Tomcat 的 CMA 一起組合使用。
JAASRealm 是 Tomcat 針對(duì)基于 JAAS 的 J2EE 1.4 的 J2EE 認(rèn)證框架的原型實(shí)現(xiàn),基于?JCP Specification Request 196,從而能夠增強(qiáng)容器管理安全性,并且能促進(jìn)“可插拔的”認(rèn)證機(jī)制,該認(rèn)證機(jī)制能夠?qū)崿F(xiàn)與容器的無(wú)關(guān)性。
根據(jù) JAAS 登錄模塊和準(zhǔn)則(參見(jiàn)?javax.security.auth.spi.LoginModule?與?javax.security.Principal?的相關(guān)說(shuō)明),你可以自定義安全機(jī)制,或者將第三方的安全機(jī)制與 Tomcat 所實(shí)現(xiàn)的 CMA 相集成。
快速入門
為了利用自定義的 JAAS 登錄模塊使用 JAASRealm,需要執(zhí)行如下步驟:
編寫自己的 JAAS 登錄模塊。在開(kāi)發(fā)自定義登錄模塊時(shí),將通過(guò) JAAS 登錄上下文對(duì)基于 JAAS?2的 User 和 Role 類管理。注意,JAASRealm 內(nèi)建的?CallbackHandler?目前只能識(shí)別?NameCallback?和?PasswordCallback。
2. 詳情請(qǐng)參看?JAAS 認(rèn)證教程?與?JAAS 登錄模塊開(kāi)發(fā)教程。
為 Java 建立一個(gè) login.config 文件(參見(jiàn)?JAAS LoginConfig 文件)。將其位置指定給 JVM,從而便于 Tomcat 明確它的位置。例如,設(shè)置如下環(huán)境變量:
JAVA_OPTS=$JAVA_OPTS -Djava.security.auth.login.config==$CATALINA_BASE/conf/jaas.config
Realm 元素屬性
在上述步驟中,為了配置步驟 6 以上的 JAASRealm,需要?jiǎng)?chuàng)建一個(gè)?<Realm>?元素,并將其內(nèi)嵌在?<Engine>?元素中的?$CATALINA_BASE/conf/server.xml?文件內(nèi)。關(guān)于 JAASRealm 中的屬性定義可參看?Realm 配置文檔。
范例
下例是 server.xml 中的一截代碼段:
<Realm className="org.apache.catalina.realm.JAASRealm"appName="MyFooRealm"userClassNames="org.foobar.realm.FooUser"roleClassNames="org.foobar.realm.FooRole"/>完全由登錄模塊負(fù)責(zé)創(chuàng)建并保存用于表示用戶規(guī)則的 User 與 Role 對(duì)象(javax.security.auth.Subject)。如果登錄模塊不僅無(wú)法創(chuàng)建用戶對(duì)象,而且也無(wú)法拋出登錄異常,Tomcat CMA 就會(huì)失去作用,所在頁(yè)面就會(huì)變成?http://localhost:8080/myapp/j_security_check?或其他未指明的頁(yè)面。
JAAS 方法具有雙重的靈活性:
- 你可以在自定義的登錄模塊后臺(tái)執(zhí)行任何所需的進(jìn)程。
- 通過(guò)改變配置以及重啟服務(wù)器,你可以插入一個(gè)完全不同的登錄模塊,不需要對(duì)應(yīng)用做出任何改動(dòng)。
特別注意事項(xiàng)
- 當(dāng)用戶首次訪問(wèn)一個(gè)受保護(hù)資源時(shí),Tomcat 會(huì)調(diào)用這一?Realm?的?authenticate()?方法。
- 一旦用戶認(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ì)生效,直到該用戶下次登錄。
- 和其他 Realm 實(shí)現(xiàn)一樣,如果?server.xml?中的?<Realm>?元素包含一個(gè)?digest?屬性,則支持摘要式密碼。JAASRealm 的?CallbackHandler?將先于將密碼傳回?LoginModule?之前,對(duì)密碼進(jìn)行摘要式處理。
CombinedRealm
簡(jiǎn)介
CombinedRealm?是一種 Tomcat 的 Realm 實(shí)現(xiàn),通過(guò)一個(gè)或多個(gè)子 Realm 進(jìn)行用戶驗(yàn)證。
通過(guò) CombinedRealm,開(kāi)發(fā)者能夠?qū)⒍鄠€(gè) Realm(同一或不同類型) 組合起來(lái)使用,從而用于驗(yàn)證多種數(shù)據(jù)源,而且萬(wàn)一當(dāng)其中一個(gè) Realm 失敗,或其他一些操作需要多個(gè) Realm 時(shí),它還能提供回滾處理。
子 Realm 是通過(guò)在定義 CombineRealm 的?Realm?元素中內(nèi)嵌?Realm?元素來(lái)實(shí)現(xiàn)的。驗(yàn)證操作會(huì)按照 Realm 元素的疊加順序來(lái)逐個(gè)進(jìn)行。對(duì)逐個(gè) Realm 進(jìn)行驗(yàn)證,從而就能充分證明用戶的身份。
Realm 元素屬性
為了配置 CombinedRealm,需要?jiǎng)?chuàng)建一個(gè)?<Realm>?元素,并將其內(nèi)嵌在?<Engine>?或?<Host>?元素中的?$CATALINA_BASE/conf/server.xml?文件內(nèi)。同樣,你也可以將其內(nèi)嵌到?context.xml?文件下的?<Context>?節(jié)點(diǎn)。
范例
下面是 server.xml 中的一段代碼,綜合使用了 UserDatabaseRealm 和 DataSourceRealm:
<Realm className="org.apache.catalina.realm.CombinedRealm" ><Realm className="org.apache.catalina.realm.UserDatabaseRealm"resourceName="UserDatabase"/><Realm className="org.apache.catalina.realm.DataSourceRealm"dataSourceName="jdbc/authority"userTable="users" userNameCol="user_name" userCredCol="user_pass"userRoleTable="user_roles" roleNameCol="role_name"/> </Realm>LockOutRealm
簡(jiǎn)介
LockOutRealm?是一個(gè) Tomcat 的 Realm 實(shí)現(xiàn),它擴(kuò)展了 CombinedRealm,假如在某一段時(shí)間內(nèi)出現(xiàn)很多驗(yàn)證失敗,則它能夠提供鎖定用戶的功能。
為了確保操作的正確性,該 Realm 允許出現(xiàn)較合理的同步。
該 Realm 并不需要對(duì)底層的 Realm 或與其相關(guān)的用戶存儲(chǔ)機(jī)制進(jìn)行任何改動(dòng)。它會(huì)記錄失敗的登錄,包括那些因?yàn)橛脩舨淮嬖诘牡卿洝榱朔乐篃o(wú)效用戶通過(guò)精心設(shè)計(jì)的請(qǐng)求而實(shí)施的 DOS 攻擊(從而造成緩存增加),沒(méi)有通過(guò)驗(yàn)證的用戶所在列表的容量受到了嚴(yán)格的限制。
子 Realm 是通過(guò)在定義 LockOutRealm 的?Realm?元素中內(nèi)嵌?Realm?元素來(lái)實(shí)現(xiàn)的。驗(yàn)證操作會(huì)按照 Realm 元素的疊加順序來(lái)逐個(gè)進(jìn)行。對(duì)逐個(gè) Realm 進(jìn)行驗(yàn)證,從而就能充分證明用戶的身份。
Realm 元素屬性
為了配置 CombinedRealm,需要?jiǎng)?chuàng)建一個(gè)?<Realm>?元素,并將其內(nèi)嵌在?<Engine>?或?<Host>?元素中的?$CATALINA_BASE/conf/server.xml?文件內(nèi)。同樣,你也可以將其內(nèi)嵌到?context.xml?文件下的?<Context>?節(jié)點(diǎn)。關(guān)于 LockOutRealm 中的屬性定義可參看?Realm 配置文檔。
范例
下面是 server.xml 中的一段代碼,為 UserDatabaseRealm 添加了鎖定功能。
<Realm className="org.apache.catalina.realm.LockOutRealm" ><Realm className="org.apache.catalina.realm.UserDatabaseRealm"resourceName="UserDatabase"/> </Realm>轉(zhuǎn)載于:https://www.cnblogs.com/pingxin/p/p00051.html
總結(jié)
- 上一篇: 约数个数定理约数和定理
- 下一篇: python函数名的运用,闭包,迭代器