我有一个场景,任何实施建议都会有很大帮助。我有一个在发布时创建的servlet,它将来自许多其他第三方应用程序的POST请求。该servlet只将传入的发布数据存储在JCR中。我已经成功创建了这个servlet,但现在要求保护这个servlet,以便只接受使用特定用户名和密码访问此servlet的应用程序。
我能做些什么来实现这个目标?
答案 0 :(得分:1)
我会采取的方式:
要求第三方应用程序向您发送用户名和密码,以便您可以在servlet上验证它们,然后决定是允许还是拒绝该请求。
来自servlet调用的(第三方应用程序)
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// ...
request.setAttribute("username", "a_valid_user");
request.setAttribute("password", "a_valid_password");
request.getRequestDispatcher("yourApp/YourServlet").forward(req, resp);
}
在您的servlet上:
String username = request.getParameter("username");
String password = request.getParameter("password");
if("a_valid_user".equals(username) && "a_valid_password".equals(password) {
// validate and go further
} else {
// do not process the request
}
以上示例仅在您可以验证它们的情况下才有效。
如果此示例没有回答您的问题,请提供有关这些第三方应用程序的更多信息以及您要验证它们的方式。
答案 1 :(得分:1)
您可以考虑使用Google客户端库。我用它来验证AEM发布实例中的用户。在对第三方服务器进行身份验证后,您可以使用单独的AEM服务帐户来处理POST处理。
下面'关于将这些库集成到AEM中的SO帖子。 Google Client API in OSGI
使用此功能,您应该可以设置第三方服务帐户的身份验证...如此处所述 https://developers.google.com/identity/protocols/OAuth2ServiceAccount
我还没有在AEM中完成服务器到服务器的身份验证,但它应该是可能的。但是在一个单独的项目(非AEM)中,我使用了Google客户端库来验证服务帐户。
答案 2 :(得分:1)
我建议使用两个步骤:
答案 3 :(得分:0)
感谢大家的回复。最后,我在cq:
中实现了以下代码进行身份验证
final String authorization = request.getHeader("Authorization");
if (authorization != null && authorization.startsWith("Basic")) {
StringTokenizer st = new StringTokenizer(authorization);
if (st.hasMoreTokens()) {
String basic = st.nextToken();
if (basic.equalsIgnoreCase("Basic")) {
String decodedStr = Base64.decode(st.nextToken());
LOGGER.info("Credentials: " + decodedStr);
int p = decodedStr.indexOf(":");
if (p != -1) {
String login = decodedStr.substring(0, p).trim();
String password = decodedStr.substring(p + 1).trim();
Credentials credentials = new SimpleCredentials(login, password.toCharArray());
adminSession = repository.login(credentials);
if (null != adminSession) {
// means authenticated and do your stuff here
}
}
}
}
}

同样在调用发布servlet的webservice代码中,下面是我在auth头文件中提供凭据的代码:
String authStr = usrname+":"+password;
// encode data on your side using BASE64
byte[] bytesEncoded = Base64.encodeBase64(authStr.getBytes());
String authEncoded = new String(bytesEncoded);
connection.setRequestProperty("Authorization", "Basic "+authEncoded);
connection.setDoOutput(true);
connection.setRequestMethod("POST");
OutputStreamWriter writer = new OutputStreamWriter(connection.getOutputStream());
writer.write("jsondata={sample:jsoncontent}");
writer.close();