我有一个 JSF Web 应用程序,它使用 cookie 进行自动身份验证,而不提示输入用户名和密码。它使用带有用户名和随机 UUID 的 cookie,并使用 WebFilter
用于重定向。
当客户端没有cookie时,通过HttpServletRequest #login(String username, String password)进行身份验证.在幕后,这种方法使用 JAAS 身份验证,并使用 LDAP
服务器在后面。
当我的应用程序通过保存用户 ID 和 UUID 的 cookie 识别用户时,我的问题就出现了。在这个情况下,
HttpServletRequest #login(String username, String password)
不能使用。 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
}
}
最佳答案
要以自定义方式(在您的情况下通过 cookie 和 UUID 而不是密码)进行实际容器登录,您需要创建自己的登录模块。
Java EE 中用于此目的的专用 API 是 JASPI/JASPIC(人们永远无法完全同意这个名称,这会使例如 google 查询变得复杂)。
登录模块处于完全控制之下,无需通过 ldap 服务器进行身份验证(如果您的应用程序可以在本地验证 cookie 是否有效 100%)。您可能确实必须授权用户(向 ldap 服务器询问用户拥有的角色/组)。
作为 JASPI/JASPIC 的替代方案,您还可以查看服务器正在使用的专有登录模块机制。
关于jsf - 使用 HttpServletRequest 和 LDAP 自动登录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11909245/