2014-12-10 1 views
2

Наше веб-приложение развернуто на 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); 
    } 
} 
+0

Не используйте 'UserDatabaseRealm'. Используйте «Царство», которое поддерживает то, что вам нужно, например, JDBC Realm или JNDI Realm. – EJP

+0

@ user3191192 не ставьте свой ответ в самом вопросе ... –

ответ

0

Я просто цифры это.

сначала вы должны обновить server.xml и добавить только для чтения = ложно:

<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 файле:

<%!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); 

/N

+0

Это не так. Здесь нет ничего, что позволяет пользователю сменить пароль. – EJP

+0

EJP, вы видели мой отредактированный ответ? (если да, не могли бы вы пометить его как ответ, пожалуйста? и, возможно, изменить голос?) – NaAl

+0

Это обеспечило ключи, которые мне нужно было сделать в сервлете, особенно в строках имен объектов ... все еще приходилось выяснять, как получить экземпляр MBeanServer. Рабочий сервлет, указанный ниже. – user3191192

Смежные вопросы