Java 如何更改用户';servlet应用程序中的tomcat密码?

Java 如何更改用户';servlet应用程序中的tomcat密码?,java,security,tomcat,servlets,passwords,Java,Security,Tomcat,Servlets,Passwords,我们的web应用程序部署在Tomcat上,目前使用UserDatabaseRealm进行安全保护。我们希望在应用程序中提供一个页面,用户可以在其中更改密码—一个简单、常见的web应用程序功能。我找不到任何示例servlet代码来实现这一点。UserDatabaseRealm的Tomcat描述意味着可以在服务器启动时加载XML后以编程方式对其进行更新,还可以将更改保存回XML文件。有一个简单的提到JMX作为一种手段,但没有细节 我们的目标是在这个应用程序中没有数据库,所以我们真的不想使用JDBC领

我们的web应用程序部署在Tomcat上,目前使用UserDatabaseRealm进行安全保护。我们希望在应用程序中提供一个页面,用户可以在其中更改密码—一个简单、常见的web应用程序功能。我找不到任何示例servlet代码来实现这一点。UserDatabaseRealm的Tomcat描述意味着可以在服务器启动时加载XML后以编程方式对其进行更新,还可以将更改保存回XML文件。有一个简单的提到JMX作为一种手段,但没有细节

我们的目标是在这个应用程序中没有数据库,所以我们真的不想使用JDBC领域。更改用户密码(以及管理员添加/删除用户)的JavaServlet代码是什么样子的

感谢您提供的线索,这是我正在使用的Tomcat MemoryUserDatabase servlet(不包括任何加密、密码验证、错误处理等):


我只是想办法

首先,必须更新server.xml并将readonly=false添加到:

然后在jsp文件中:

 <%!public static boolean changePasswd(String user, String passwd, MBeanServer mbeanServer, JspWriter out) throws Throwable{ 
try {
String userFDN = "Users:type=User,username=\""+user+"\",database=UserDatabase"; 
ObjectName userObjName = new ObjectName(userFDN);
MBeanInfo info = mbeanServer.getMBeanInfo(userObjName);

Attribute attr=new Attribute("password",passwd);
mbeanServer.setAttribute(userObjName, attr);
ObjectName databaseObjName=new ObjectName("Users:type=UserDatabase,database=UserDatabase");
Object result= mbeanServer.invoke(databaseObjName,"save",new Object[0],new String[0]); 
out.println("<b>Changed password and, Saved: "+result+"</b>");
return true;    
} catch (Throwable t) {
out.print("<font color='red'>WHY: </font>" + t);
} 
return false; 
}%>

  <%MBeanServer mbeanServer = (MBeanServer) list.get(0); 
  //ObjectName obname = new ObjectName(   "Catalina:type=Resource,resourcetype=Global,class=org.apache.catalina.UserDatabase,name=\"UserDatabase\"" );
   ArrayList list = MBeanServerFactory.findMBeanServer(null);  
   MBeanServer mbeanServer = (MBeanServer) list.get(0);
   changePasswd("user","passwd",mbeanServer,out);


不要使用
UserDatabaseRealm
。使用支持您所需内容的
领域,例如JDBC领域或JNDI领域。@user3191192不要将答案放在问题本身中…它不会。这里没有允许用户更改密码的内容。EJP,您看到我编辑的答案了吗?(如果是这样,请您将其标记为“答案”好吗?也许还可以更改投票结果?)这提供了在servlet中执行此操作所需的线索,特别是对象名称字符串。。。仍然需要弄清楚如何获取MBeanServer实例。工作servlet代码发布在下面。
 <%!public static boolean changePasswd(String user, String passwd, MBeanServer mbeanServer, JspWriter out) throws Throwable{ 
try {
String userFDN = "Users:type=User,username=\""+user+"\",database=UserDatabase"; 
ObjectName userObjName = new ObjectName(userFDN);
MBeanInfo info = mbeanServer.getMBeanInfo(userObjName);

Attribute attr=new Attribute("password",passwd);
mbeanServer.setAttribute(userObjName, attr);
ObjectName databaseObjName=new ObjectName("Users:type=UserDatabase,database=UserDatabase");
Object result= mbeanServer.invoke(databaseObjName,"save",new Object[0],new String[0]); 
out.println("<b>Changed password and, Saved: "+result+"</b>");
return true;    
} catch (Throwable t) {
out.print("<font color='red'>WHY: </font>" + t);
} 
return false; 
}%>

  <%MBeanServer mbeanServer = (MBeanServer) list.get(0); 
  //ObjectName obname = new ObjectName(   "Catalina:type=Resource,resourcetype=Global,class=org.apache.catalina.UserDatabase,name=\"UserDatabase\"" );
   ArrayList list = MBeanServerFactory.findMBeanServer(null);  
   MBeanServer mbeanServer = (MBeanServer) list.get(0);
   changePasswd("user","passwd",mbeanServer,out);