Я пытаюсь реализовать простую функцию единого входа в моем весеннем веб-приложении. Сценарий:
У меня есть основное приложение Application1 и дополнительное приложение2. Оба имеют свои собственные механизмы входа в систему (используя формы входа в систему Spring-Security).
Я хочу реализовать единый вход в приложение 1, чтобы при входе пользователя в приложение 1 он также мог беспрепятственно обращаться к приложению 2 по ссылке, не заполняя данные для входа в приложение 2.
Вот что я попробовал:
Я создал API в Application2, который принимает электронную почту в качестве входных данных, проверяет ее, создает сеанс пользователя и возвращает строку URL.
@RequestMapping(path = "/sso/login", consumes = "application/json", method = RequestMethod.POST)
public String login(@RequestBody SSOparams params, HttpServletRequest req, ModelMap model) {
// 1. validates email from params
// 2. creates Authentication object:
UsernamePasswordAuthenticationToken authReq = new UsernamePasswordAuthenticationToken(username, password);
Authentication auth = authManager.authenticate(authReq);
SecurityContext sc = SecurityContextHolder.getContext();
sc.setAuthentication(auth);
HttpSession session = req.getSession(true);
session.setAttribute(HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY, sc);
// 3. returns a url string:
return "/user/dashboard";
}
Пользователь входит в приложение 1.
На домашней странице Application1, когда пользователь щелкает ссылку Application2, вызывается метод контроллера Application1.
Метод контроллера Application1 вызывает API входа Application2 с параметром электронной почты и, наконец, перенаправляет на URL-адрес, возвращенный из API.
Метод контроллера Application1:
@RequestMapping(value = "/callapplication2", method = RequestMethod.POST)
public String callapplication2(ModelMap model,HttpSession session) {
String output = "";
String redirectionUrl = "";
try {
// 1. calling application2's login API
URL url = new URL("http://localhost:8080/application2/api/sso/login");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setDoOutput(true);
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "application/json");
String input = "{\"uniqueemail\":\"abc@gmail.com\"}";
OutputStream os = conn.getOutputStream();
os.write(input.getBytes());
os.flush();
BufferedReader br = new BufferedReader(new InputStreamReader((conn.getInputStream())));
while ((output = br.readLine()) != null) {
redirectionUrl = redirectionUrl + output;
}
conn.disconnect();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
// 2. returns a url
return "redirect:http://localhost:8080/application2" + redirectionUrl ;
}
Все вышеперечисленное работает нормально. Но когда я войду в Application1 и нажму на ссылку application2, я ожидаю, что приложение должно перенаправить
http://localhost:8080/application2/user/dashboard
без заполнения учетных данных.
Но вместо этого открывается страница входа в Application2. Я вижу в сетевой консоли Chrome, что /user/dashboard
вызывается, но поскольку страница защищена, я перенаправлен на страницу входа application2.
Означает ли это, что аутентификация, которую я создал с помощью API, не используется. Чего мне не хватает?