在 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/123456或admin1/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 拒绝。
五、配置生效与验证
- 保存
server.xml、tomcat-users.xml等文件。 - 重启 Tomcat。
- 验证:
- 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 "%r" %s %b" />
</Host>
</Engine>