我有一个 JSF Web 应用程序,它使用 cookie 进行自动身份验证,而不提示输入用户名和密码。它使用带有用户名和随机 UUID 的 cookie,并使用 aWebFilter
进行重定向。
当客户端没有 cookie 时,通过HttpServletRequest #login(String username, String password)完成身份验证。在幕后,这种方法使用 JAAS 身份验证,并LDAP
在后面使用服务器。
当我的应用程序通过保存用户 ID 和 UUID 的 cookie 识别用户时,我的问题就出现了。在这个情况下,
- 应用程序不知道密码,因此
HttpServletRequest #login(String username, String password)
无法使用该方法。 - 我应该通过 JNDI 向 LDAP 服务器询问密码吗?乍一看,这似乎是不可能的
- 或者,我可以将密码存储在我的数据库中。但这意味着信息的重复,我不喜欢这样。
- 我见过周围的人只是将属性“角色”设置为会话,但这似乎并不等同于 JAAS 登录。“等效”是指能够使用
isUserInRole()
和getUserPrincipal()
方法。
所以,问题是:在这种情况下我应该如何登录用户?我希望这个问题现在更清楚了。
编辑
为了让代码说话,我添加了一个简化版的 Managed Bean:
@ManagedBean
@SessionScoped
public class loginBean() {
private String username = null;
private String password = null;
private UUID uuid = null;
private boolean rememberMe = false;
public void doLogin() {
checkCookies(); // this method sets the property values after checking if
// username & uuid match the ones saved previously
if (username != null && uuid != null && rememberMe) {
// authenticate automatically. Here I don't know how to proceed, because
// I don't have the password, unless I have saved it in the application's db,
// duplicating it because it's already in LDAP server.
} else {
httpServletRequest.login(username, password); // this uses LDAP behind JAAS
createCookies(); // this method also saves username & uuid in the app's db
}
}