Как я могуполучить список залогинынных пользователей в Spring Security
Есть веб-приложение и аутентификация в нем сделана на Spring Security. Так вот хочется добавить функцию бана в приложении. Следовательно как админ забанил пользователя необходимо "убить" сессию забаненного пользователя. как я могу это сделать? или хотя бы как получить список всех открытых сессий, как в манеджере Tomcat?
Ответы (1 шт):
Поступил следующим образом:
1) Создал класс-сервис, который хранит хэшмап с ид_пользователем и его сессией;
import org.springframework.stereotype.Service;
import javax.servlet.http.HttpSession;
import java.util.HashMap;
@Service
public class HttpSessionsService {
HashMap<Integer, HttpSession> userAndSession = new HashMap<>();
public void add(Integer userId, HttpSession session) {
this.userAndSession.put(userId, session);
System.out.println(userAndSession);
}
public HashMap<Integer, HttpSession> getUserAndSession() {
return userAndSession;
}
}
2) Зная, что в случае успешной авторизации в AuthenticationProvider, пользователя редиректит на определенный url, то повесил на него @Requestmapping, где запихиваю в мапу необходимую инфу
@RequestMapping(value = "/chat", method = RequestMethod.GET)
public ModelAndView chat(@AuthenticationPrincipal User user, HttpSession session) {
httpSessionsService.add(user.getId(), session);
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("index");
modelAndView.addObject("user", user);
return modelAndView;
}
3) Мы имеем класс-сервис, в котором хранятся наши пользователи и их сессия. и в случаи необходимости можно сделать определенному пользователю недействительную сессию. ну или, что нашей душе угодно) (мой пример)
@RequestMapping(value="/delete_admin/{id}", method = RequestMethod.GET)
public ModelAndView deleteUser(@PathVariable("id") int id) {
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("redirect:/admin_panel?page=" + this.page);
User user = userService.getById(id);
destroySession(user.getId());
userService.delete(user);
return modelAndView;
}
private void destroySession(int userId) {
userService.setStatusOffline(userService.getById(userId));
httpSessionsService.getUserAndSession().get(userId).invalidate();
httpSessionsService.getUserAndSession().remove(userId);
}
Не утверждаю, что это единственный правильный способ, но я выкрутился, таким образом. Буду рад комментарием по-моему способу решения проблемы.