在Tomcat中配置虚拟主机的访问权限

在 Tomcat 中给虚拟主机配置访问权限,核心是通过 RemoteAddrValve(IP 控制)Realm(用户 / 角色认证) 以及 Context 级权限 实现,可在 server.xml<Host> 标签内直接配置。下面按最常用场景给出完整可复制方案。

一、虚拟主机 IP 访问控制(白名单 / 黑名单)

通过 RemoteAddrValve 限制哪些 IP 能访问该虚拟主机,直接写在 <Host> 内部

1. 仅允许指定 IP / 网段访问(白名单)

xml
<Host name="www.site1.com" appBase="D:/site1" unpackWARs="true" autoDeploy="true">
  <!-- 仅允许 192.168.1.0/24 网段 + 10.0.0.5 访问 -->
  <Valve
    className="org.apache.catalina.valves.RemoteAddrValve"
    allow="192\.168\.1\.\d+|10\.0\.0\.5"
    deny=""
  />
  <!-- 访问日志(可选) -->
  <Valve className="org.apache.catalina.valves.AccessLogValve"
         directory="logs" prefix="site1_access" suffix=".log" />
</Host>
  • allow:允许的 IP / 网段,支持正则、CIDR(如 192.168.1.0/24)。
  • deny:拒绝的 IP,留空表示只放行 allow 列表。

2. 拒绝指定 IP / 网段(黑名单)

xml
<Valve
  className="org.apache.catalina.valves.RemoteAddrValve"
  allow=".*"
  deny="192\.168\.1\.100|10\.0\.0\.0\/24"
/>
  • allow=".*":默认允许所有,再用 deny 排除恶意 IP。

二、虚拟主机用户 / 角色认证(登录访问)

给整个虚拟主机加用户名 + 密码登录,基于 Tomcat 内置 Realm 实现。

1. 配置用户与角色(conf/tomcat-users.xml

xml
<tomcat-users>
  <!-- 定义角色 -->
  <role rolename="site1-user" />
  <role rolename="site1-admin" />
  <!-- 定义用户 -->
  <user username="user1" password="123456" roles="site1-user" />
  <user username="admin1" password="admin@123" roles="site1-admin" />
</tomcat-users>

2. 在虚拟主机中启用认证(server.xml

<Host> 内添加 <Realm><Context> 配置:
xml
<Host name="www.site1.com" appBase="D:/site1" ...>
  <!-- 1. 配置用户数据源(基于 tomcat-users.xml) -->
  <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
         resourceName="UserDatabase" />

  <!-- 2. 配置根路径(/)的安全约束 -->
  <Context path="" docBase="ROOT" reloadable="true">
    <!-- 安全约束:所有请求需认证 -->
    <security-constraint>
      <web-resource-collection>
        <web-resource-name>Protected Area</web-resource-name>
        <url-pattern>/*</url-pattern>
      </web-resource-collection>
      <auth-constraint>
        <!-- 允许的角色 -->
        <role-name>site1-user</role-name>
        <role-name>site1-admin</role-name>
      </auth-constraint>
    </security-constraint>
    <!-- 认证方式:BASIC 弹窗 / FORM 表单 -->
    <login-config>
      <auth-method>BASIC</auth-method>
      <realm-name>Site1 Protected Area</realm-name>
    </login-config>
  </Context>
</Host>
  • 访问 www.site1.com:8080 时会弹出登录框,输入 user1/123456admin1/admin@123 才能访问。

三、虚拟主机内不同应用的权限隔离

同一虚拟主机下,不同应用(Context)可配置独立的 IP 限制独立的用户认证

示例:/admin 路径仅管理员可访问

xml
<Host name="www.site1.com" appBase="D:/site1" ...>
  <Realm ... />

  <!-- 普通应用:允许所有用户 -->
  <Context path="/" docBase="ROOT">
    <security-constraint>
      <url-pattern>/*</url-pattern>
      <auth-constraint><role-name>site1-user</role-name></auth-constraint>
    </security-constraint>
    <login-config><auth-method>BASIC</auth-method></login-config>
  </Context>

  <!-- 管理后台:仅 admin 角色 + 特定 IP 可访问 -->
  <Context path="/admin" docBase="admin">
    <!-- IP 白名单 -->
    <Valve className="org.apache.catalina.valves.RemoteAddrValve"
           allow="192\.168\.1\.10|127\.0\.0\.1" />
    <!-- 角色限制 -->
    <security-constraint>
      <url-pattern>/*</url-pattern>
      <auth-constraint><role-name>site1-admin</role-name></auth-constraint>
    </security-constraint>
    <login-config><auth-method>BASIC</auth-method></login-config>
  </Context>
</Host>

四、Host Manager 管理界面的权限控制(可选)

若需通过 host-manager 图形界面管理虚拟主机,需额外配置:

1. 配置管理员用户(tomcat-users.xml

xml
<user username="host-admin" password="host@123" roles="admin-gui,admin-script" />
  • admin-gui:允许访问图形界面;admin-script:允许脚本调用。

2. 放行管理界面的 IP(webapps/host-manager/META-INF/context.xml

xml
<Context antiResourceLocking="false" privileged="true">
  <Valve className="org.apache.catalina.valves.RemoteAddrValve"
         allow="127\.\d+\.\d+\.\d+|::1|192\.168\.1\.\d+" />
  <Manager sessionAttributeValueClassNameFilter="..."/>
</Context>
  • 修改 allow 为你的管理机 IP,否则会 403 拒绝。

五、配置生效与验证

  1. 保存 server.xmltomcat-users.xml 等文件。
  2. 重启 Tomcat。
  3. 验证:
    • IP 限制:用被拒绝的 IP 访问,应返回 403 Forbidden。
    • 用户认证:未登录访问应弹出登录框或跳转到登录页。
    • 查看日志:logs/catalina.out 与虚拟主机独立日志。

六、常用配置模板(直接复制)

xml
<Engine name="Catalina" defaultHost="localhost">
  <!-- 默认主机 -->
  <Host name="localhost" appBase="webapps" autoDeploy="true">
  </Host>

  <!-- 带权限的虚拟主机:www.site1.com -->
  <Host name="www.site1.com" appBase="D:/site1" unpackWARs="true" autoDeploy="true">
    <!-- IP 白名单 -->
    <Valve className="org.apache.catalina.valves.RemoteAddrValve"
           allow="192\.168\.1\.\d+|10\.0\.0\.5" deny="" />
    <!-- 用户认证 -->
    <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
           resourceName="UserDatabase" />
    <!-- 根应用安全约束 -->
    <Context path="" docBase="ROOT" reloadable="true">
      <security-constraint>
        <web-resource-collection>
          <web-resource-name>All</web-resource-name>
          <url-pattern>/*</url-pattern>
        </web-resource-collection>
        <auth-constraint>
          <role-name>site1-user</role-name>
        </auth-constraint>
      </security-constraint>
      <login-config>
        <auth-method>BASIC</auth-method>
        <realm-name>Site1</realm-name>
      </login-config>
    </Context>
    <!-- 访问日志 -->
    <Valve className="org.apache.catalina.valves.AccessLogValve"
           directory="logs" prefix="site1_access" suffix=".log"
           pattern="%h %l %u %t &quot;%r&quot; %s %b" />
  </Host>
</Engine>
上一篇 路由器为什么叫路由器
下一篇 H3C WCG系列无线中控网关 Web配置指导(E1038P04)-5W100