Как я могуполучить список залогинынных пользователей в Spring Security

Есть веб-приложение и аутентификация в нем сделана на Spring Security. Так вот хочется добавить функцию бана в приложении. Следовательно как админ забанил пользователя необходимо "убить" сессию забаненного пользователя. как я могу это сделать? или хотя бы как получить список всех открытых сессий, как в манеджере Tomcat?


Ответы (1 шт):

Автор решения: Denis Moore

Поступил следующим образом:

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

Не утверждаю, что это единственный правильный способ, но я выкрутился, таким образом. Буду рад комментарием по-моему способу решения проблемы.

→ Ссылка