我有一个简单的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>
您可以使用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。要保存此设置,全局资源的只读属性必须为false。
ud.save();