Наше веб-приложение развернуто на Tomcat, в настоящее время используется UserDatabaseRealm для обеспечения безопасности. Мы хотим предоставить страницу в приложении, где пользователь может изменить свой пароль - простая, обычная функция веб-приложения. Я не могу найти какой-либо пример кода сервлета для этого. Описание Tomcat UserDatabaseRealm подразумевает, что он может быть обновлен программно после загрузки XML при запуске сервера и может также сохранить изменения обратно в файл XML. Существует краткое упоминание JMX как средства, но никаких подробностей.Как изменить пароль пользователя tomcat в сервлет-приложении?
Наша цель - не иметь базы данных в этом приложении, поэтому мы действительно не хотим использовать JDBC Realm. Как выглядит код сервлета Java для изменения пароля пользователя (и для администратора, для добавления/удаления пользователей)?
Спасибо за подсказки, вот мой работает Tomcat MemoryUserDatabase сервлет (минус любое шифрование, проверка пароля, обработку ошибок и т.д.):
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
// Get current password for currently authenticated user
String username = request.getRemoteUser();
MBeanServer server = ManagementFactory.getPlatformMBeanServer();
ObjectName userObjName = new ObjectName("Users:type=User,username=\""+username+"\",database=UserDatabase");
Object password = server.getAttribute(userObjName, "password");
System.out.println("Current Password = "+password.toString());
// Get new password from request parms and update the DB
String newPw = request.getParameter("newpw");
server.setAttribute(userObjName, new Attribute("password", newPw));
// Password is updated in-memory, now write to file.
// Note Tomcat MemoryUserDatabase.save() implementation does not synchronize this
// operation, so it can fail badly if multiple users do this at the same time.
// Ugh. Should do this in a static synchronized method.
server.invoke(
new ObjectName("Users:type=UserDatabase,database=UserDatabase"),
"save",
new Object[0],
new String[0]);
// If no exception, save was OK (it returns VOID, so there is no return value to check)
}
catch (Throwable t) {
// Should return proper HTTP error code...
t.printStackTrace(System.err);
}
}
Не используйте 'UserDatabaseRealm'. Используйте «Царство», которое поддерживает то, что вам нужно, например, JDBC Realm или JNDI Realm. – EJP
@ user3191192 не ставьте свой ответ в самом вопросе ... –