gpt4 book ai didi

java - 在 OSGi 中为 servlet 配置身份验证

转载 作者:行者123 更新时间:2023-11-30 09:00:56 25 4
gpt4 key购买 nike

我有 Karaf 3.0.2 作为我的容器,它使用 pax web(我认为它再次使用 jetty )。我有几个 servlet,我在某个别名下注册为 OSGi 服务。

默认情况下,etc/jetty.xml 配置为我可以使用 JAASLoginService,这也是我希望使用的。

问题是,我想同时使用基本身份验证和表单例份验证:

  • 所有匹配/ui/* 的东西都应该使用表单认证
  • 所有匹配/rest/* 的东西都应该使用基本身份验证

我尝试了很多,但我什至没有找到可以开始的点。我认为可以配置每个 servlet,但我想在全局范围内进行配置。

有什么想法吗?

最佳答案

你在这里做了一些区分。如果您使用 WebApplicationBundle (WAB) 来部署您的 Servlet,您将拥有 Web 应用程序的所有常规元素。包括基本或基于表单的身份验证。

由于您正在使用 OSGi 方式注册 Servlet,因此您只能通过 HttpContext 来完成此操作。以下示例取自 Pax Web Samples ,它使用基本身份验证。

public class AuthHttpContext implements HttpContext {

public boolean handleSecurity(HttpServletRequest req,
HttpServletResponse res) throws IOException {

if (req.getHeader("Authorization") == null) {
res.sendError(HttpServletResponse.SC_UNAUTHORIZED);
return false;
}
if (authenticated(req)) {
return true;
} else {
res.sendError(HttpServletResponse.SC_UNAUTHORIZED);
return false;
}

}

protected boolean authenticated(HttpServletRequest request) {
request.setAttribute(AUTHENTICATION_TYPE, HttpServletRequest.BASIC_AUTH);

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);

// Here I will do lame hard coded credential check. HIGHLY NOT RECOMMENDED!
boolean success = ((username.equals("admin") && password
.equals("admin")));
if (success)
request.setAttribute(REMOTE_USER, "admin");
return success;
}

...
}

对于基于表单的,您将需要一个额外的 HttpContext。对于每个匹配路径,您需要确保注册了正确的 HttpContext,以下代码也可以在 Pax Web Samples 找到.

public final class Activator implements BundleActivator {

...

public void start(BundleContext bc) throws Exception {
httpServiceRef = bc.getServiceReference(HttpService.class);
if (httpServiceRef != null) {
httpService = (HttpService) bc.getService(httpServiceRef);

...

httpService.registerServlet("/status-with-auth",
new StatusServlet(), null, new AuthHttpContext());
}
}
...
}

关于java - 在 OSGi 中为 servlet 配置身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26592821/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com