代码之家  ›  专栏  ›  技术社区  ›  skaffman

HTTP AuthTM解码的开源Java服务器端实现

  •  0
  • skaffman  · 技术社区  · 15 年前

    我需要在servlet应用程序中执行HTTP身份验证逻辑,而不是将此任务委托给容器。

    具体来说,我需要一种方法来获取 HttpServletRequest 它包含HTTP认证头,并将其解码为表示所提供凭证的数据结构,然后应用程序可以处理这些凭证。应支持基本身份验证和摘要式身份验证。

    我可以用手写,这不会太麻烦,RFC都有很好的文档记录,但我很想用现成的库来完成。

    我的第一个想法是Spring安全性,但是从我所能告诉这个委托任务到容器(我对此有点不清楚,这是一个复杂的代码库)。

    有人知道其他人吗?

    3 回复  |  直到 12 年前
        1
  •  2
  •   David Rabinowitz    15 年前
    • 对于basic,很容易实现——只需读取头,base64对其进行解码,并将其拆分为“:”字符。也可以使用弹簧 BasicProcessingFilter ,并提供您的实例 AuthenticationManager .
    • 使用Digest,您无法从请求中获取密码(这就是整个要点…)。实现所有细节并不是一项简单的任务,即使认为协议是有良好文档记录的。所以我要和春天一起去 DigestProcessingFilter . 在这种情况下,您需要提供 UserDetailsService 谁根据用户名(用于摘要)提供用户密码。
        2
  •  1
  •   MateusR    12 年前

    这是我的解码器:

    public static String[] decodeBasicAuth(String authorization) {
        if (authorization == null)
            throw new RuntimeException("Invalid Authorization String.");
        if (authorization.length() < 9)
            throw new RuntimeException("Invalid Authorization String.");
        if (authorization.length() > 64)
            throw new RuntimeException("Invalid Authorization String.");
        String s[] = authorization.split("\\s", 3);
        if (s.length < 2)
            throw new RuntimeException("Invalid Authorization String.");
        for (int i = 0; i < s.length; i++) {
            String part = s[i];
            if (part.compareTo("Basic") == 0) {
                String userPassBase64 = s[i + 1];
                if (!userPassBase64.isEmpty()) {
                    String userPass = null;
                    try {
                        userPass = new String(DatatypeConverter.parseBase64Binary(userPassBase64));
                    } catch (RuntimeException e) {
                        throw new RuntimeException("Authorization cannot be decoded.", e);
                    }
                    String userPassArray[] = userPass.split(":");
                    if (userPassArray.length == 2) {
                        return userPassArray;
                    } else {
                        throw new RuntimeException("Invalid Authorization String.");
                    }
                } else {
                    throw new RuntimeException("Invalid Authorization String.");
                }
            }
        }
        throw new RuntimeException("Authorization cannot be decoded.");
    }
    
        3
  •  0
  •   Sam Barnum    15 年前

    我现在还不知道框架,但是除非您使用基本身份验证,否则您可能无法获取用户的密码。

    如果您使用的是基本身份验证,那么 Base64Decode 这个 Authentication 标题。