Java 如何更改用户';servlet应用程序中的tomcat密码?
我们的web应用程序部署在Tomcat上,目前使用UserDatabaseRealm进行安全保护。我们希望在应用程序中提供一个页面,用户可以在其中更改密码—一个简单、常见的web应用程序功能。我找不到任何示例servlet代码来实现这一点。UserDatabaseRealm的Tomcat描述意味着可以在服务器启动时加载XML后以编程方式对其进行更新,还可以将更改保存回XML文件。有一个简单的提到JMX作为一种手段,但没有细节 我们的目标是在这个应用程序中没有数据库,所以我们真的不想使用JDBC领域。更改用户密码(以及管理员添加/删除用户)的JavaServlet代码是什么样子的 感谢您提供的线索,这是我正在使用的Tomcat MemoryUserDatabase servlet(不包括任何加密、密码验证、错误处理等):Java 如何更改用户';servlet应用程序中的tomcat密码?,java,security,tomcat,servlets,passwords,Java,Security,Tomcat,Servlets,Passwords,我们的web应用程序部署在Tomcat上,目前使用UserDatabaseRealm进行安全保护。我们希望在应用程序中提供一个页面,用户可以在其中更改密码—一个简单、常见的web应用程序功能。我找不到任何示例servlet代码来实现这一点。UserDatabaseRealm的Tomcat描述意味着可以在服务器启动时加载XML后以编程方式对其进行更新,还可以将更改保存回XML文件。有一个简单的提到JMX作为一种手段,但没有细节 我们的目标是在这个应用程序中没有数据库,所以我们真的不想使用JDBC领
我只是想办法 首先,必须更新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);