UserDatabaseRealm 领域实现是从静态文件 %CATALINA_HOME%/conf/tomcat-users.xml 中读取 Tomcat 所用的用户、密码及角色。且这些用户、密码及角色存在于内存中,只有当 Tomcat 停止后才从内存中清除这些信息。
注意:如果更改了 tomcat-users.xml 文件,需要重启 Tomcat 才会生效。
tomcat-users.xml 文件是使用此领域的关键。它包含一份可以访问 Web 应用程序的用户清单。这是一个简单的 XML 文件,根元素是 <tomcat-users>,根元素下只能使用 <role> 和 <user> 元素。每一个 <role> 元素只有一个 rolename 属性,用来指定角色名称。而每一个 <user> 元素则有三个属性:
(1)username 定义用户名
(2)password 定义用户密码
(3)roles 定义用户拥有的角色,多个角色使用逗号(,)分割
下面是 Tomcat 默认安装中含的 tomcat-users.xml 文件的内容:
<tomcat-users> <role rolename="tomcat"/> <role rolename="role1"/> <user username="tomcat" password="tomcat" roles="tomcat"/> <user username="both" password="tomcat" roles="tomcat,role1"/> <user username="role1" password="tomcat" roles="role1"/> </tomcat-users>
角色(role)是一组用户,而针对这组用户,Web应用程序可以定义一组特定的功能组合。例如:Manager 应用程序是 Tomcat 内置的一个用来管理(启动、停止、部署等)其他 Web 应用程序的 Web 程序。要使用此应用程序,必须创建属于 manager 角色的用户。当第一次访问 Manager 应用程序时,浏览器要求输入此角色的用户名与密码,而且除非使用该角色的用户登录,否则无法访问包含 Manager 应用程序的目录。
UserDatabaseRealm 并不适合用于生产环境,因为它的唯一更新方式是编写能够经由 JNDI 访问领域的自定义 Servlet。而该 Servlet 需要能够修改内存中的用户数据库,或磁盘上的 tomcat-users.xml 文件。最后,还需要重启 Tomcat,这些修改才能生效。
如果我们在修改 tomcat-users.xml 时,角色配置存在问题,当访问 tomcat 内置应用时就会看见如下错误信息。如下图:
请注意,对于 Tomcat7 及更高版本,使用 Manager 应用程序所需的角色已从单一 manager 角色更改为以下四个角色。您需要分配要访问的功能所需的角色。
manager-gui 允许访问HTML图形用户界面和状态页面。
manager-script 允许访问文本界面和状态页面。
manager-jmx 允许访问JMX代理和状态页面。
manager-status 仅允许访问状态页。
修改完 tomcat-users.xml 文件后,需要在 server.xml 文件中开启该领域,配置如下:
<!-- Use the LockOutRealm to prevent attempts to guess user passwords via a brute-force attack --> <Realm className="org.apache.catalina.realm.LockOutRealm"> <!-- This Realm uses the UserDatabase configured in the global JNDI resources under the key "UserDatabase". Any edits that are performed against this UserDatabase are immediately available for use by the Realm. --> <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/> </Realm>