2014-11-05 33 views
4

我有一個簡單的Java Web應用程序,不超過20-25個用戶將會登錄。我目前使用Tomcat服務器來承載它,並使用UderDatabaseRealm進行訪問控制。我想爲這個應用程序添加一個功能,其中管理員可以通過應用程序本身將用戶添加到系統中。我想知道是否有可能以編程方式將用戶添加到此文件。 我能想到的一種方法是在我的應用程序中打開tomcat_users.xml文件並執行XML操作來添加用戶。有沒有比這更好的方法?如何以編程方式向tomcat UserDatabaseRealm添加用戶?

我的境界是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

您可以使用JNDI從運行的Tomcat獲取UserDatabase對象,並提供有關您的用戶和角色的所有信息。您必須確定您的UserDatabase在你的server.xml全球資源,並添加一個資源鏈接到你的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> 

的context.xml你的web應用的

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

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中的完整示例

+0

感謝您的回覆。我知道JDBC領域,但想知道是否有其他方法。我們不想使用數據庫,這個解決方案需要一個數據庫。 – avimonk 2014-11-05 17:02:16

0

根據您的原始問題,Tomcat在啓動時讀取tomcat-users.xml,並且不會在服務器運行時讀取對文件本身進行的任何更改。如果您想在運行時動態進行更改,則需要使用JMX與UserDatabaseRealm MBean進行交互。

更好的選擇幾乎可以肯定切換到使用DataSourceRealm,正如早先的答案建議。

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

相關問題