【发布时间】:2015-01-13 01:12:22
【问题描述】:
我们的 Web 应用程序部署在 Tomcat 上,目前使用 UserDatabaseRealm 来确保安全。我们希望在应用程序中提供一个页面,用户可以在其中更改密码 - 一个简单、常见的 Web 应用程序功能。我找不到任何示例 servlet 代码来执行此操作。 UserDatabaseRealm 的 Tomcat 描述暗示它可以在服务器启动时加载 XML 后以编程方式更新,它还可以将更改保存回 XML 文件。简要提到了 JMX 作为一种手段,但没有详细说明。
我们的目标是在这个应用程序中没有数据库,所以我们真的不想使用 JDBC 领域。更改用户密码(对于管理员来说,添加/删除用户)的 Java servlet 代码是什么样的?
感谢提供线索,这是我正在工作的 Tomcat MemoryUserDatabase servlet(减去任何加密、密码验证、错误处理等):
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。使用支持您需要的Realm,例如 JDBC 领域或 JNDI 领域。 -
@user3191192 不要把你的答案放在问题本身...
标签: java security tomcat servlets passwords