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/

相关文章
相关标签/搜索