Tomcat容器管理安全的驗證方式匯總
當訪問服務器中受保護的資源時,容器管理的驗證方法可以控制確認用戶身份的方式。Tomcat支持四種容器管理的安全防護,它們是:
1、BASIC(基本驗證):通過HTTP驗證,需要提供base64編碼文本的用戶口令
2、DIGEST(摘要驗證):通過HTTP驗證,需要提供摘要編碼字符串的用戶口令
3、FORM(表單驗證):在網(wǎng)頁的表單上要求提供密碼
4、CLIENT-CERT(客戶端證書驗證):以客戶端證書來確認用戶的身份
基本驗證
當web.xml文件中的auth-method元素設置為BASIC時,表明應用使用的是基本驗證,每次瀏覽器請求受保護的Web應用資源時,Tomcat都會使用HTTP基本驗證向瀏覽器索取用戶名和密碼(以頁面彈窗的方式)。使用這種驗證方法,所有的密碼都會以base64編碼的文本在網(wǎng)絡上傳輸。
先看下項目結構(我用Maven管理的依賴):
其中,protect/protect.jsp是被保護的,需要授權訪問。
說明:本文提到的tomcat-users.xml,server.xml等文件,如果是在Eclipse中啟動tomcat,則這些文件在Eclipse中的Servers工程下對應的tomcat下,如圖:
而本文提到的web.xml是指項目自己的web.xml,而非Servers項目下Tomcat中的web.xml。
web.xml
<security-constraint>
<web-resource-collection>
<http-method>GET</http-method>
<web-resource-name>tomcat protect page</web-resource-name>
<!-- /protect目錄下的所有資源是受保護的 -->
<url-pattern>/protect/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<!-- 這里的member要與tomcat-user.xml中配置的role一致 -->
<role-name>member</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<!-- 驗證方式,可選的值為: "BASIC", "DIGEST", "FORM", "CLIENT-CERT" -->
<auth-method>BASIC</auth-method>
<!-- 使用的Realm名字,注意這里不能有空格 -->
<realm-name>MyConstraints</realm-name>
</login-config>
tomcat-user.xml(注意如果是在Eclipse中啟動tomcat,這個tomcat-user.xml在Eclipse中的Servers工程下)
<role rolename="member"/>
<!-- member角色下有一個叫alvis的用戶,密碼為pwd -->
<user username="alvis" password="pwd" roles="member"/>
重啟tomcat后,訪問protect目錄下的資源,情況是這樣的:
輸入賬戶alvis,密碼pwd后,訪問成功(當然,非protect目錄下的資源是可以直接訪問的):
摘要驗證
當web.xml文件中的auth-method元素設置為DIGEST時,表明應用使用的是摘要驗證。還是上面的例子,看配置:
web.xml和基本驗證一樣,只是auth-method修改為DIGEST,此處不贅述。
server.xml中的UserDatabaseRealm(如果tomcat使用的是其他Realm,也一樣的)里增加digest屬性:
接下來,要生成tomcat可識別的MD5密碼。方式有兩種,正如官網(wǎng)描述:
Tomcat,容器管理,安全驗證
方式一:用代碼來生成:
import org.apache.catalina.realm.RealmBase;
public class T {
public static void main(String[] args) {
//參數(shù)1:要加密的字符串;參數(shù)2:加密算法;參數(shù)3:字符串的編碼
String base = RealmBase.Digest("alvis:MyConstraints:pwd", "MD5", null);
System.out.println(base);
}
}
由于RealmBase類在catalina.jar包中,如果項目中沒有這個類,可在項目上右鍵-->Java Build Path--> Libraries-->Add Library-->選擇Server Runtime-->選擇Apache Tomcat V8.0(其實7.0也行),如圖:
方式二:用腳本來生成:
在tomcat/bin目錄下有個digest.sh(Linux系統(tǒng))或digest.bat(Windows系統(tǒng))腳本,運行這個腳本,傳入摘要算法和參數(shù)即可,這里我在Windows系統(tǒng)上運行,如圖:
這里的-a指定摘要算法為MD5,要特別注意這里的參數(shù)是:{用戶名}:{Realm名}:{密碼明文}。用戶名就是tomcat-users.xml中配置的<user>名字(這里為alvis),Realm名是在web.xml中配置的<realm-name>(這里為MyConstraints),密碼明文即該用戶用于登錄的密碼(我這里設為pwd)。
只有這樣的參數(shù)加密后的密碼,在tomcat-users.xml中配置才有效,否則是登錄不了的。由于我是參考《Tomcat權威指南(第二版)》的步驟做的,之前試了很久都不知道為什么登錄不了,結果在官網(wǎng)找到答案,是這么描述的:
Tomcat,容器管理,安全驗證
大意是說,如果使用DIGEST方式驗證,用于生成摘要的明文必須被替換為這種格式。實踐出真知,所以還是不能完全看書啊,動手實踐才是實在的。
然后就是在tomcat-users.xml中配置生成的密碼(通過下方的截圖,可以比較password跟上方digest.bat腳本生成的密碼是否一致):
之后重啟tomcat,效果自然是跟使用基本驗證的效果一樣了。
表單驗證
當web.xml文件中的auth-method元素設置為FORM時,表明應用使用的是表單驗證。當用戶請求Web應用程序受保護的資源時,表單驗證會跳轉(zhuǎn)至配置的登錄頁面。當?shù)卿浭r,還需要一個驗證失敗的頁面,還是上面的例子,看配置:
web.xml
<security-constraint>
<web-resource-collection>
<http-method>GET</http-method>
<web-resource-name>tomcat member part</web-resource-name>
<url-pattern>/protect/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>member</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>FORM</auth-method>
<realm-name>MyConstraints</realm-name>
<form-login-config>
<form-login-page>/form/login.html</form-login-page>
<form-error-page>/form/error.html</form-error-page>
</form-login-config>
</login-config>
這里的form/login.html是用于登錄的頁面,而form/error.html則是驗證失敗后跳轉(zhuǎn)到的頁面(這兩個頁面在上方的工程結構圖中已經(jīng)有了)。
login.html
<html>
<body>
<h2>Login Page.</h2>
<form method="post" action="j_security_check" name="loginForm">
<input type="text" name="j_username" /><br>
<input type="password" name="j_password" /><br>
<input type="submit" value="Login" />
</form>
</body>
</html>
注意:這里form的action="j_security_check",賬號的name="j_username"和密碼的name="j_password"都是不可變的,否則配置的驗證規(guī)則不起作用。
server.xml中,要去掉Realm中添加的“digest=MD5”這個屬性:
tomcat-users.xml中使用明文保存密碼:
效果(僅在訪問protect目錄下的資源時才出現(xiàn)Login Page):
輸入錯誤的賬號和密碼,跳轉(zhuǎn)至form/error.html頁面:
輸入正確的賬號和密碼,跳轉(zhuǎn)至受保護的頁面:
客戶端證書驗證
待續(xù)
Demo下載:
鏈接: http://pan.baidu.com/s/1gfnqVdT 密碼: pubw
參考頁面:
相關文章
Tomcat報錯: JDBC unregister 解決辦法
這篇文章主要介紹了Tomcat報錯: JDBC unregister 解決辦法的相關資料,需要的朋友可以參考下2017-05-05Tomcat部署SpringBoot項目的war包的方法及詳細步驟
這篇文章主要介紹了Tomcat部署SpringBoot項目的war包的方法,本文分步驟結合實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-07-07淺談Tomcat中<Context>標簽的使用方式和注意事項
本文主要介紹了淺談Tomcat中<Context>標簽的使用方式和注意事項,Context標簽可以設置Tomcat默認項目,設置項目的瀏覽器訪問路徑,讓項目修改后自動重新編譯部署,感興趣的可以了解下2023-11-11Tomcat8使用cronolog來進行Catalina.Out日志分割方法
今天通過本文給大家分享如何使用cronolog來分割catalina.out日志文件,對Tomcat Catalina.Out日志分割方法感興趣的朋友跟隨小編一起看看吧2021-09-09