如何以编程方式将用户添加到tomcat UserDatabaseRealm?

时间:2014-11-05 16:06:18

标签: java xml tomcat jdbcrealm

我有一个简单的Java Web应用程序,用户不超过20-25个。我目前正在使用tomcat服务器来托管它,并使用UderDatabaseRealm进行访问控制。我想为此应用程序添加一项功能,其中管理员可以通过应用程序本身将用户添加到系统。我想知道是否可以以编程方式将用户添加到此文件。 我能想到的一种方法是在我的应用程序中打开tomcat_users.xml文件并进行XML操作以添加用户。还有比这更好的方法吗?

我的域在servers.xml中配置为: -

<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>

My tomcat_users.xml file is as follows:-
<tomcat-users>

  <role rolename="admin"/>
  <role rolename="local"/>
  <user username="tomcat" password="tomcat" roles="admin"/>
</tomcat-users>

5 个答案:

答案 0 :(得分:5)

您可以使用更灵活的东西:数据库。您需要配置org.apache.catalina.realm.DataSourceRealm

<强> DB

CREATE TABLE tomcat_users (
    user_name varchar(20) NOT NULL PRIMARY KEY,
    password varchar(250) NOT NULL
);
CREATE TABLE tomcat_roles (
    user_name varchar(20) NOT NULL,
    role_name varchar(20) NOT NULL,
    PRIMARY KEY (user_name, role_name) 
);

<强> server.xml

<Realm className="org.apache.catalina.realm.DataSourceRealm"
   dataSourceName="jdbc/auth"
   digest="MD5"
   userTable="tomcat_users" userNameCol="user_name" userCredCol="password"
   userRoleTable="tomcat_roles" roleNameCol="role_name"/>

<强> context.xml

<Resource name="jdbc/auth" auth="Container" type="javax.sql.DataSource"
   maxActive="100" maxIdle="30" maxWait="10000"
   username="realm_access" password="password" driverClassName="com.mysql.jdbc.Driver"
   url="jdbc:mysql://localhost:3306/tomcat_realm"/>

请参阅http://wiki.apache.org/tomcat/TomcatDataSourceRealmshttp://java.dzone.com/articles/setting-apache-tomcat-basic

中的完整示例

答案 1 :(得分:5)

您可以使用JNDI从正在运行的tomcat中获取UserDatabase对象,其中包含有关您的用户和角色的所有信息。您必须在server.xml中将UserDatabase定义为全局资源,并向context.xml文件添加资源链接,如下所示:

server.xml中

<GlobalNamingResources>

     <Resource auth="Container" description="User database that can be updated and saved"
        factory="org.apache.catalina.users.MemoryUserDatabaseFactory" name="UserDatabase"
        pathname="/home/user/tomcat-users.xml" type="org.apache.catalina.UserDatabase"
        readonly="false" />

</GlobalNamingResources>

<Realm className="org.apache.catalina.realm.LockOutRealm">

    <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>

</Realm>

你的webapp的context.xml

<Context>

    <ResourceLink name="UserDatabase" global="UserDatabase"
        type="org.apache.catalina.UserDatabase" />

</Context>

现在您可以使用InitialContext来获取UserDatabase对象:

UserDatabase ud = (UserDatabase) new InitialContext().lookup("java:comp/env/UserDatabase");

现在您可以调用此数据库的方法,如:

ud.createUser("username", "password", "fullname");

不要忘记调用ud.save();方法,以便可以将更改写入xmlfile。要保存它,全局资源的readonly属性必须为false。

答案 2 :(得分:0)

就原始问题而言,Tomcat在启动时读取tomcat-users.xml,并且不会在服务器运行时获取对文件本身所做的任何更改。如果要在运行时动态进行更改,则需要使用JMX与UserDatabaseRealm MBean进行交互。

更好的选择几乎可以肯定是转而使用DataSourceRealm,正如前面的回答所示。

答案 3 :(得分:0)

另一种方法是使用Tomcat documentation建议的JMX。以下链接可能会有所帮助。

但正如Paul Vargas所说,在这种情况下使用DataSourceRealm将是一个更容易的解决方案。

答案 4 :(得分:0)

以下是如何将新用户添加到tomcat的JSP示例: 首先更新server.xml文件,为资源readonly="false"添加auth="Container"属性:

<Resource auth="Container" readonly="false" 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"/>

然后在jsp文件中:

ArrayList list = MBeanServerFactory.findMBeanServer(null);
MBeanServer mbeanServer = (MBeanServer) list.get(0);
ObjectName obname=new ObjectName("Users:type=UserDatabase,database=UserDatabase");
MBeanInfo info = mbeanServer.getMBeanInfo( obname );
Object name=mbeanServer.invoke(obname,"createUser",new String[]{"user","pwd","fname"},new String[]{String.class.getName(),String.class.getName(),String.class.getName()});
mbeanServer.invoke(obname,"save",new Object[0],new String[0]);

您还可以更改用户的密码,请参阅我的回答: How to change a user's tomcat password in servlet application