У меня есть встроенный причальный сервер, который просматривает список веб-приложений (список варьируется в зависимости от развертывания) из разных мест. Я пытаюсь перейти от базовой проверки подлинности к проверке подлинности с помощью формы.
Я бы хотел сделать что-то вроде:
// create constraint
Constraint usersOnly = new Constraint(Constraint.__FORM_AUTH, "user");
usersOnly.setAuthenticate(true);
ConstraintMapping requireAuthentication = new ConstraintMapping();
requireAuthentication.setConstraint(usersOnly);
requireAuthentication.setPathSpec("/*");
// create login service
LoginService loginService = new HashLoginService("realm");
loginService.setConfig("users.txt");
// create form authentication
FormAuthenticator formAuthenticator = new FormAuthenticator("/login", "/login", true);
// create /login route
ServletHolder loginServlet = new ServletHolder(new DefaultServlet() {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().append("<html>\n<head>\n<title>Login</title>\n</head>\n<body>\n"
+ "<form method='POST' action='/j_security_check'>\n"
+ "<input type='text' name='j_username'/>\n"
+ "<input type='password' name='j_password'/>\n"
+ "<input type='submit' value='Login'/>\n</form>\n</body>\n</html>\n");
}
});
ConstraintSecurityHandler securityHandler = new ConstraintSecurityHandler();
securityHandler.addMapping(requireAuthentication);
securityHandler.setLoginService(loginService);
securityHandler.setAuthenticator(formAuthenticator);
// assign security to each webapp
for (WebAppContext webapp : webapps) {
webapp.setSecurityHandler(securityHandler);
webapp.addServlet(loginServlet, "/login");
}
Это работает должным образом, если в веб-приложениях есть только одно веб-приложение, но если их несколько, вам будет предлагаться войти в систему каждый раз, когда вы переходите по ссылке из одного веб-приложения в другое, и каждый раз при повторной аутентификации вы перенаправляетесь на базовое веб-приложение по адресу маршрут "/" и аутентифицированы только для этого.
Я хочу, чтобы мои контексты обменивались сеансами.
Согласно этим вопросом, имея общий SessionManager для каждого экземпляра WebAppContext должен решить проблему, но у запрашивающего был только один экземпляр WebAppContext. Если я попытаюсь назначить один и тот же экземпляр SessionManager каждому WebAppContext, я получу NPE.
Я также видел, что некоторые ресурсы указывают на установку пути к SessionCookieConfig каждого контекста к общему пути контекста, а для useRequestedId - на true для каждого SessionManager WebAppContext, но это решение предназначено для org.mortbay.jetty и устарело.
Если у вас есть какое-либо понимание или опыт настройки единого входа для встроенного сервера пристаней с несколькими WebAppContexts, или если вы можете придумать лучший способ обслуживания нескольких отдельных веб-приложений на одном общем сервере, укажите мне правильное направление.
Как я могу разрешить пользователю проходить аутентификацию во всех веб-приложениях, обслуживаемых одним сервером, заполнив единую форму?
Дайте мне знать, если я не понимаю, или у вас есть вопросы.