jsf - 使用 HttpServletRequest 和 LDAP 自动登录

标签 jsf jakarta-ee authentication jaas jaspic

我有一个 JSF Web 应用程序,它使用 cookie 进行自动身份验证,而不提示输入用户名和密码。它使用带有用户名和随机 UUID 的 cookie,并使用 WebFilter用于重定向。

当客户端没有cookie时,通过HttpServletRequest #login(String username, String password)进行身份验证.在幕后,这种方法使用 JAAS 身份验证,并使用 LDAP服务器在后面。

当我的应用程序通过保存用户 ID 和 UUID 的 cookie 识别用户时,我的问题就出现了。在这个情况下,

  • 应用程序不知道密码,所以方法 HttpServletRequest #login(String username, String password)不能使用。
  • 我应该通过 JNDI 向 LDAP 服务器询问密码吗?乍一看这似乎是不可能的
  • 或者,我可以将密码存储在我的数据库中。但这意味着信息的重复,我不喜欢这样。
  • 我看过around人们只是将属性“角色”设置为 session ,但这似乎并不等同于 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
            }
        }
    

    最佳答案

    要以自定义方式(在您的情况下通过 cookie 和 UUID 而不是密码)进行实际容器登录,您需要创建自己的登录模块。

    Java EE 中用于此目的的专用 API 是 JASPI/JASPIC(人们永远无法完全同意这个名称,这会使例如 google 查询变得复杂)。

    登录模块处于完全控制之下,无需通过 ldap 服务器进行身份验证(如果您的应用程序可以在本地验证 cookie 是否有效 100%)。您可能确实必须授权用户(向 ldap 服务器询问用户拥有的角色/组)。

    作为 JASPI/JASPIC 的替代方案,您还可以查看服务器正在使用的专有登录模块机制。

    关于jsf - 使用 HttpServletRequest 和 LDAP 自动登录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11909245/

    相关文章:

    com.sun.faces.renderkit.RenderKitUtils.getCommandLinkOnClickScript 处的 java.lang.NullPointerException

    jsf - PrimeFaces 3.2 DataTable "jump to page"分页器模板?

    java - 字符编码过滤器,韩文字符编码问题

    java - 从两个表创建一个引用表

    php - 交响乐 2 : manual login and Json Web Token

    authentication - 如果我更改语言文件中的行,登录页面上的 OpenCart 文本不会更改

    java - 在 IE 中验证后,Seam Action 解析为空

    jsf - 获取组件的坐标

    java - JPA : Generating Data Transfer Object DTO from Entity and merging DTO to database 的模式

    security - 在 IIS 中需要客户端证书而不需要 SSL