Jsf 使用HttpServletRequest和LDAP自动登录
我有一个JSFWeb应用程序,它使用cookies进行自动身份验证,而不提示输入用户名和密码。它使用带有用户名和随机UUID的cookie,并使用Jsf 使用HttpServletRequest和LDAP自动登录,jsf,jakarta-ee,authentication,jaas,jaspic,Jsf,Jakarta Ee,Authentication,Jaas,Jaspic,我有一个JSFWeb应用程序,它使用cookies进行自动身份验证,而不提示输入用户名和密码。它使用带有用户名和随机UUID的cookie,并使用WebFilter进行重定向 当客户端没有cookie时,身份验证通过。在幕后,这种方法使用JAAS身份验证,并在背后使用LDAP服务器 当我的应用程序通过保存userid和UUID的cookies识别用户时,我的问题就来了。在这种情况下, 应用程序不知道密码,因此无法使用方法HttpServletRequest#login(字符串用户名、字符串密码)
WebFilter
进行重定向
当客户端没有cookie时,身份验证通过。在幕后,这种方法使用JAAS身份验证,并在背后使用LDAP
服务器
当我的应用程序通过保存userid和UUID的cookies识别用户时,我的问题就来了。在这种情况下,
HttpServletRequest#login(字符串用户名、字符串密码)
isUserInRole()
和getUserPrincipal()
方法@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
}
}
在这种情况下使用LDAP条目相当于请求目录服务器使用应用程序提供的信息对连接进行身份验证。就LDAP而言,身份验证意味着现有LDAP会话(即到目录服务器的连接)已通过成功的绑定请求更改了其身份验证状态 web应用程序应该向要进行身份验证的用户请求适当的信息,并将此信息作为绑定请求提供给目录服务器。所需信息因web应用程序(LDAP客户端)使用的身份验证方法而异:
- 简单绑定请求需要可分辨名称和密码。此可分辨名称和密码应通过安全连接作为简单绑定请求传输到目录服务器
- 使用预定义SASL机制的SASL绑定请求。每台服务器的机制各不相同,范围从GSSAPI到普通
- 使用Cookie不会处理浏览器禁用Cookie的情况,并且在使用会话时不需要Cookie来维护身份验证状态
- 会话不需要密码,也不应该在内存或会话中存储任何敏感信息,如密码。当身份验证状态过期(如果有)或会话过期(如果有)时,应用程序应请求密码
作为JASPI/JASPIC的替代方案,您还可以查看服务器正在使用的专有登录模块机制 如果LDAP设置正确,则无法从LDAP获取密码。你为什么认为你需要它?你没有,哇!事实上,我还没能得到密码。我认为这是一个许可问题。为什么我不需要密码?密码是用于身份验证的。LDAP已经完成了身份验证。你不需要它。您认为为什么要这样做?在此会话中,用户尚未进行身份验证。他在上一次会话中这样做了,当时应用程序创建了cookies并将它们的值保存在数据库中。在此会话中,应用程序读取Cookie,将值与保存在db中的值进行比较,并决定应自动对用户进行身份验证。因此,您不需要密码,因为他必须已在上一会话中提供了密码。您根本不需要返回LDAP。你需要的一切都应该在旧的会话中出现。听起来你在告诉询问者去做一些他或她要求如何做的事情。引导他们绕圈-1如果你问我的话。@BillR这里不太清楚用户到底在问什么,你可以给出一个正确完整的答案。谢谢你的回答。我知道我需要通过在应用程序的数据库中保存密码或创建自定义SAM模块来处理此逻辑。