【问题标题】:how to programatically add users to tomcat UserDatabaseRealm?如何以编程方式将用户添加到 tomcat UserDatabaseRealm?
【发布时间】:2015-01-01 21:53:05
【问题描述】:

我有一个简单的 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>

【问题讨论】:

    标签: java xml tomcat jdbcrealm


    【解决方案1】:

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

    数据库

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

    【讨论】:

    • 感谢您的回复。我知道 JDBC 领域,但想知道是否有其他方法。我们不想使用数据库,这个解决方案需要一个数据库。
    【解决方案2】:

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

    正如之前的回答所建议的,几乎可以肯定,更好的选择是切换到使用 DataSourceRealm。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

        <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

        【讨论】:

          【解决方案5】:

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

          服务器.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。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-12-09
            • 1970-01-01
            • 1970-01-01
            • 2013-08-05
            • 1970-01-01
            • 2016-10-10
            • 1970-01-01
            • 2011-08-22
            相关资源
            最近更新 更多