Tomcat 6 —— Realm域管理


本篇來源於官方文檔,但不僅僅是翻譯,其中不乏網上搜索的資料與自己的理解。

如有錯誤,請予指正。

什么是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框架訪問授權信息

  (后續會給出不同的Realm的配置方式)
 

 配置過程

  1 在server.xml中配置realm訪問方式

  參考下默認的配置server.xml中,可以看到默認情況下使用的就是UserDatabaseRealm的方式:

  上圖中的代碼配置了UserDatabase的目錄文件,為conf/tomcat-users.xml

  上圖中的代碼配置使用的Realm方式。

  2 在tomcat-users.xml中配置用戶密碼以及分配角色
  

  上面是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/

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM