Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何以编程方式将用户添加到tomcat UserDatabaseRealm?_Java_Xml_Tomcat_Jdbcrealm - Fatal编程技术网

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

Java 如何以编程方式将用户添加到tomcat UserDatabaseRealm?,java,xml,tomcat,jdbcrealm,Java,Xml,Tomcat,Jdbcrealm,我有一个简单的JavaWeb应用程序,登录用户不超过20-25人。我目前使用tomcat服务器来托管它,并使用UderDatabaseRealm进行访问控制。我想在此应用程序中添加一个功能,管理员可以通过应用程序本身向系统添加用户。我想知道是否可以通过编程方式将用户添加到此文件。 我可以想到的一种方法是在我的应用程序中打开tomcat_users.xml文件,并进行xml操作以添加用户。还有比这更好的方法吗 我的领域在servers.xml中配置为:- <Realm className="

我有一个简单的JavaWeb应用程序,登录用户不超过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>

我的tomcat_users.xml文件如下所示:-

您可以使用更灵活的工具:数据库。您需要配置一个

DB

创建表tomcat\u用户(
用户名varchar(20)非空主键,
密码varchar(250)不为空
);
创建表tomcat_角色(
用户名varchar(20)不为空,
角色名称varchar(20)不为空,
主键(用户名、角色名)
);
server.xml


context.xml



请参阅中的完整示例和

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


正如前面的答案所建议的那样,更好的选择几乎肯定是切换到使用DataSourceALM。

另一种选择是按照。以下链接可能会有所帮助


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

下面是一个JSP示例,介绍如何向tomcat添加新用户: 首先更新
server.xml
文件,为资源
auth=“Container”
添加
readonly=“false”
属性:

您还可以更改用户的密码查看我的答案:

您可以使用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>
现在您可以调用此数据库的方法,如:

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

不要忘记调用
ud.save()谢谢您的回复。我知道JDBC领域,但想知道是否还有其他方法。我们不想使用数据库,这个解决方案需要一个数据库。
<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>
<Context>

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

</Context>
UserDatabase ud = (UserDatabase) new InitialContext().lookup("java:comp/env/UserDatabase");
ud.createUser("username", "password", "fullname");