繁体   English   中英

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

[英]how to programatically add users to tomcat UserDatabaseRealm?

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

您可以使用更灵活的东西:数据库。 您需要配置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中的完整示例

您可以使用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。

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

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

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

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

这是一个如何将新用户添加到tomcat的JSP示例:首先更新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]);

您还可以更改用户的密码,请参阅我的答案: 如何在servlet应用程序中更改用户的tomcat密码

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM