本篇來源於官方文檔,但不僅僅是翻譯,其中不乏網上搜索的資料與自己的理解。
如有錯誤,請予指正。
什么是Realm
首先說一下什么是Realm,可以把它理解成“域”,也可以理解成“組”,因為它類似 類Unix系統 中組的概念。
Realm域提供了一種用戶密碼與web應用的映射關系。
因為tomcat中可以同時部署多個應用,因此並不是每個管理者都有權限去訪問或者使用這些應用,因此出現了用戶的概念。但是想想,如果每個應用都去配置具有權限的用戶,那是一件很麻煩的事情,因此出現了role這樣一個概念。具有某一角色,就可以訪問該角色對應的應用,從而達到一種域的效果。
參考上面的圖:
每個用戶我們可以設置不同的角色(在tomcat-users.xml中配置),
每個應用中會設定可以訪問的角色(在web.xml中配置),
當tomcat啟動后,就會通過Realm進行驗證(在server.xml中配置),通過驗證才可以訪問該應用,
從而達到角色安全管理的作用。
理解server.xml
在tomcat中,要理解其架構設計,可以參考下面的圖,該圖是從《Apahce tomcat高級配置》一書中扒下來的。
參考上面的圖解釋下:
server:即服務器,每個tomcat程序啟動后,就是一個server。
service:這是一種抽象的服務,通常是在日志或者管理時使用這樣一個概念。它把連接器和處理引擎結合在一起。
connector:用於處理連接和並發,通常包括兩種方式HTTP和AJP。HTTP是用於網頁地址欄http這種訪問方式;AJP一般用於搭配Apache服務器。
engine:處理引擎,所有的請求都是通過處理引擎處理的。
host:虛擬主機,用於進行請求的映射處理。每個虛擬主機可以看做獨立的請求文件。
realm:用於配置安全管理角色,通常讀取tomcat-uesrs.xml進行驗證。
context:上下文,對應於web應用。
有了上面的概念的理解,就可以簡單的想象一下tomcat的處理過程:
大體過程如下:
0 首先請求發送給服務器;
1 服務器使用相應的服務進行處理。
2 先通過不同的連接器請求后發送給處理引擎。
3 處理引擎通過對虛擬主機的分析,發送給相應的虛擬主機。
4 虛擬主機使用相應的應用進行相應。
簡言之,就是請求會先發送到連接器,連接器轉給處理引擎進行處理。
再看看默認的server.xml配置文件
<?xml version="1.0" encoding="UTF-8"?> <Server port="8005" shutdown="SHUTDOWN"> <Listener SSLEngine="on" className="org.apache.catalina.core.AprLifecycleListener"/> <Listener className="org.apache.catalina.core.JasperListener"/> <Listener className="org.apache.catalina.mbeans.ServerLifecycleListener"/> <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener"/> <GlobalNamingResources> <Resource auth="Container" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" name="UserDatabase" pathname="conf/tomcat-users.xml" type="org.apache.catalina.UserDatabase"/> </GlobalNamingResources> <Service name="Catalina"> <Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/> <Connector port="8009" protocol="AJP/1.3" redirectPort="8443"/> <Engine defaultHost="localhost" name="Catalina"> <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/> <Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true" xmlNamespaceAware="false" xmlValidation="false"> <Context docBase="E:\software\Tomcat6.0.14\apache-tomcat-6.0.14\wtpwebapps\firstFilter" path="/firstFilter" reloadable="true" source="org.eclipse.jst.jee.server:firstFilter"/> <!-- 自己添加的 --> </Host> </Engine> </Service> </Server>
去掉注釋部分可以觀察的更方便,可以看到默認情況下,Realm的配置位置是在Engine標簽內部,並且使用的是UserDatabase的方式。其他的方式會在下面部分說明。
其中Realm的不同位置也會影響到它作用的范圍。
1 在<Engine>元素內部 —— Realm將會被所有的虛擬主機上的web應用共享,除非它被<Host>或者<Context>元素內部的Realm元素重寫。
2 在<Host>元素內部 —— 這個Realm將會被本地的虛擬主機中的所有的web應用共享,除非被<Context>元素內部的Realm元素重寫。
3 在<Context>元素內部 —— 這個Realm元素僅僅被該Context指定的應用使用。
Realm獲取用戶信息方式
目前tomcat支持多種Realm管理方式,即支持多種方式來讀取用戶信息進行驗證。參考如下:
1 JDBCRealm 用戶授權信息存儲於某個關系型數據庫中,通過JDBC驅動獲取信息驗證
2 DataSourceRealm 用戶授權信息存儲於關於型數據中,通過JNDI配置JDBC數據源的方式獲取信息驗證
3 JNDIRealm 用戶授權信息存儲在基於LDAP的目錄服務的服務器中,通過JNDI驅動獲取並驗證
4 UserDatabaseRealm 默認的配置方式,信息存儲於XML文檔中 conf/tomcat-users.xml
5 MemoryRealm 用戶信息存儲於內存的集合中,對象集合的數據來源於xml文檔 conf/tomcat-users.xml
6 JAASRealm 通過JAAS框架訪問授權信息
配置過程
參考下默認的配置server.xml中,可以看到默認情況下使用的就是UserDatabaseRealm的方式:
上圖中的代碼配置了UserDatabase的目錄文件,為conf/tomcat-users.xml
上圖中的代碼配置使用的Realm方式。
上面是tomcat-users.xml中的配置內容。
3 在應用的web.xml中配置其訪問角色以及安全限制的內容
關於Realm域的使用,一般都是用來管理一些安全性要求很高的應用,最常見的就是manager應用。
manager應用用於在不停止tomcat的情況下部署或者停止某些應用,處於安全考慮,默認情況下時不能訪問manager應用的,因此需要現在tomcat-users.xml中添加用戶以及相應的角色,才能訪問。
參考下tomcat中manager應用的角色配置,觀察其web.xml配置文件,可以找到下面這段:
<security-constraint> <web-resource-collection> <web-resource-name>HTMLManger and Manager command</web-resource-name> <url-pattern>/jmxproxy/*</url-pattern> <url-pattern>/html/*</url-pattern> <url-pattern>/list</url-pattern> <url-pattern>/sessions</url-pattern> <url-pattern>/start</url-pattern> <url-pattern>/stop</url-pattern> <url-pattern>/install</url-pattern> <url-pattern>/remove</url-pattern> <url-pattern>/deploy</url-pattern> <url-pattern>/undeploy</url-pattern> <url-pattern>/reload</url-pattern> <url-pattern>/save</url-pattern> <url-pattern>/serverinfo</url-pattern> <url-pattern>/status/*</url-pattern> <url-pattern>/roles</url-pattern> <url-pattern>/resources</url-pattern> </web-resource-collection> <auth-constraint> <!-- NOTE: This role is not present in the default users file --> <role-name>manager</role-name> </auth-constraint> </security-constraint> <!-- Define the Login Configuration for this Application --> <login-config> <auth-method>BASIC</auth-method> <realm-name>Tomcat Manager Application</realm-name> </login-config> <!-- Security roles referenced by this web application --> <security-role> <description> The role that is required to log in to the Manager Application </description> <role-name>manager</role-name> </security-role>
其中role-name就定義了可以訪問的角色。
其他內容中上面定義了限制訪問的資源,下面的Login-config比較重要。
它定義了驗證的方式,BASIC就是基本的彈出對話框輸入用戶名密碼。還是DIGEST方式,這種方式會對網絡中的傳輸信息進行加密,更安全。
參考
【1】Realms and AAA:http://tomcat.apache.org/tomcat-6.0-doc/realm-howto.html
【2】Realm 配置:http://wibiline.iteye.com/blog/655424
【3】Tomcat安全域:http://blog.163.com/liangge_sky/blog/static/210500188201102031733245/