OSGi环境中的Servlet基本身份验证

您首先需要获得对OSGI HTTP Service的引用。 您可以通过声明性服务来做到这一点。 这篇文章将集中在获得对HTTP服务的引用之后的步骤。 注意:此职位的完整课程位于此处
通过OSGI HTTP Service注册Servlet时,它为您提供了提供HTTPContext实现的选项。
httpService.registerServlet(alias, new MyServlet(), initParams, null);

当我们实现HTTPContext接口时,我们可以实现三种方法。 在提供给ermmm的请求之前,将调用这三(3)个handleSecurity中的一部分……检查安全性。

public class BasicAuthSecuredContext implements HttpContext{
    @Override
    public boolean handleSecurity(HttpServletRequest request, HttpServletResponse response) throws IOException {
        return false;
    }

    @Override
    public URL getResource(String s) {
        return null;  
    }

    @Override
    public String getMimeType(String s) {
        return null;
    }
}

因此,在实现此功能时,我从OSGI HTTPContext文档HTTP Authentication spec中借用了很多内容。 如果您有兴趣学习很多东西,深入研究细节等内容,则必须阅读它们。或者您也可以阅读本文的其余部分。

首先,除非使用https,否则不进行基本身份验证是一件大事。 如果不存在,我们会让用户知道它是禁区。 让我们继续做。

if (!request.getScheme().equals("https")) {
    response.sendError(HttpServletResponse.SC_FORBIDDEN);
    return false;
}

接下来,让我们检查Authorization标头。 如果那不在那里,我们会让他们知道,他们需要那种东西才能在那里。 或者我们只是说他们是未经授权的。 现在开始吧。

if (request.getHeader("Authorization") == null) {
            response.sendError(HttpServletResponse.SC_UNAUTHORIZED);
            return false;
}

好的,两项测试通过了。 现在,我们做一些实际的工作。 让我们提取标头以对其进行解码,然后执行“不太正确”的身份验证。

protected boolean authenticated(HttpServletRequest request) {
        String authzHeader = request.getHeader("Authorization");
        String usernameAndPassword = new String(Base64.decodeBase64(authzHeader.substring(6).getBytes()));

        int userNameIndex = usernameAndPassword.indexOf(":");
        String username = usernameAndPassword.substring(0, userNameIndex);
        String password = usernameAndPassword.substring(userNameIndex + 1);
        // Now, do the authentication against in the way you want, ex: ldap, db stored uname/pw
        // Here I will do lame hard coded credential check. HIGHLY NOT RECOMMENDED! 
        return ((username.equals("username") && password.equals("password"));
    }

让我们将此方法集成到handleSecurity方法中。 请注意,当安全性失败时,如何将有意义的错误消息设置为响应(第14行)。 这样可以防止用户猜测,并且他们知道出了什么问题。 Ermm,至少,如果他们知道HTTP错误代码,他们将确切知道出了什么问题。

@Override
    public boolean handleSecurity(HttpServletRequest request, HttpServletResponse response) throws IOException {
        if (!request.getScheme().equals("https")) {
            response.sendError(HttpServletResponse.SC_FORBIDDEN);
            return false;
        }
        if (request.getHeader("Authorization") == null) {
            response.sendError(HttpServletResponse.SC_UNAUTHORIZED);
            return false;
        }
        if (authenticated(request)) {
            return true;
        } else {
            response.sendError(HttpServletResponse.SC_UNAUTHORIZED);
            return false;
        }
    }

而已。 现在,在注册Servlet时传递该对象,

httpService.registerServlet(alias, new MyServlet(), initParams, new BasicAuthSecuredContext());

…并看到OSGI Servlet中基本身份验证的强大功能!

参考: 我们的JCG合作伙伴 Mackie Mathew的dev_religion博客上, 在OSGI环境中为Servlet实现Servlet的基本身份验证


翻译自: https://www.javacodegeeks.com/2012/06/servlet-basic-auth-in-osgi-environment.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值