Tomcat 6 —— Realm域管理

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

若有錯誤,請予指正。web

什麼是Realm

  首先說一下什麼是Realm,能夠把它理解成「域」,也能夠理解成「組」,由於它相似 類Unix系統 中組的概念。數據庫

  Realm域提供了一種用戶密碼與web應用的映射關係。apache

  由於tomcat中能夠同時部署多個應用,所以並非每一個管理者都有權限去訪問或者使用這些應用,所以出現了用戶的概念。可是想一想,若是每一個應用都去配置具備權限的用戶,那是一件很麻煩的事情,所以出現了role這樣一個概念。具備某一角色,就能夠訪問該角色對應的應用,從而達到一種域的效果。tomcat

  參考上面的圖:安全

  每一個用戶咱們能夠設置不一樣的角色(在tomcat-users.xml中配置),服務器

  每一個應用中會設定能夠訪問的角色(在web.xml中配置),網絡

  當tomcat啓動後,就會經過Realm進行驗證(在server.xml中配置),經過驗證才能夠訪問該應用,session

  從而達到角色安全管理的做用。架構

理解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/

相關文章
相關標籤/搜索