我们使用Vaadin(7)并使用以下演示作为我们的应用程序的基础:
在开发期间,我的同事(目前正在度假)也对登录做了一些更改。在上面的原始源代码中,我们看到以下login()
- 方法:
private void login() {
if (accessControl.signIn(username.getValue(), password.getValue())) {
loginListener.loginSuccessful();
} else {
showNotification(new Notification("Login failed",
"Please check your username and password and try again.", Notification.Type.HUMANIZED_MESSAGE));
username.focus();
}
}
在我们的应用程序中,这已更改为:
private void login() {
try {
VaadinServletService.getCurrentServletRequest().login(
this.username.getValue(), this.password.getValue());
this.loginListener.loginSuccessful();
} catch (...) {
// Here we do some things on fail, which is irrelevant for this question
}
}
不确定它是否相关,但我们有这个UIServlet:
@WebServlet(urlPatterns = "/*", name = "OurUIServlet", asyncSupported = true)
@VaadinServletConfiguration(ui = OurUI.class, productionMode = false)
public static class OurUIServlet extends VaadinServlet {
private static final long serialVersionUID = -5302116211234266347L;
}
不幸的是,我和Vaadin的经历比我的同事少,所以我有几个问题(他在度假回来时也会问他):
1)首先,我对这个Servlet的登录方法如何知道在哪里查找用户名和密码感到困惑。在我们的(Oracle)数据库中,我们有一个这样的表:
USER:
USR_ID NUMBER(16, 0)
USR_NAME VARCHAR2(50 BYTES)
PASSWORD VARCHAR2(256 BYTES)
... (Full name, email, language, etc.)
配置此Servlet的登录名何时知道要查找USR_NAME
和PASSWORD
?
2)我创建了一个使用PBKDF2WithHmacSHA1
作为散列方法的类,包括使用随机盐(当然)。这个类还有一个布尔方法接受一个字符串和一个保存的哈希值,并检查它是否是正确的密码
如果有人想知道它,我可以添加这个类,但它的实现是无关紧要的。您唯一需要知道的是它使用随机盐(这意味着散列总是随机的并且与前一个散列不完全匹配),并且它有一个布尔方法来检查密码是否为哈希值和哈希值de database都代表相同的密码。所以我不能简单地将数据库哈希与生成的哈希进行比较,因为它们是不同的。我必须使用布尔方法。
所以,我的主要问题是我必须在哪里实现这个布尔方法?目前,Servlet的登录名做了一个黑盒子来检查给定的用户名/密码是否与数据库中的用户名/密码匹配,但是如何替换它以便它可以通过用随机盐检查布尔方法来登录?