本篇來源於官方文檔,但不單單是翻譯,其中不乏網上搜索的資料與本身的理解。html
若有錯誤,請予指正。web
首先說一下什麼是Realm,能夠把它理解成「域」,也能夠理解成「組」,由於它相似 類Unix系統 中組的概念。數據庫
Realm域提供了一種用戶密碼與web應用的映射關係。apache
由於tomcat中能夠同時部署多個應用,所以並非每一個管理者都有權限去訪問或者使用這些應用,所以出現了用戶的概念。可是想一想,若是每一個應用都去配置具備權限的用戶,那是一件很麻煩的事情,所以出現了role這樣一個概念。具備某一角色,就能夠訪問該角色對應的應用,從而達到一種域的效果。tomcat
參考上面的圖:安全
每一個用戶咱們能夠設置不一樣的角色(在tomcat-users.xml中配置),服務器
每一個應用中會設定能夠訪問的角色(在web.xml中配置),網絡
當tomcat啓動後,就會經過Realm進行驗證(在server.xml中配置),經過驗證才能夠訪問該應用,session
從而達到角色安全管理的做用。架構
在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指定的應用使用。
目前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/