@DeNissss4444

Как сделать что бы имя пользователя выводило на каждой странице сайта, а не только на главной?

У меня есть аутентификация пользователя которая выводит его имя, если он вошел на сайт под своим логином, если же он не зарегистрирован на сайте, то пишет Аноним. Я вывожу эту проверку сбоку в меню на сайте. Получается я написал это в главном контроллере который отвечает за стартовую страницу сайта. Проблема состоит в том, что когда я через меню перехожу в другой раздел сайта, к примеру блог, то там уже в меню естественно проверки нет и ничего не выводиться. Мне же надо что бы выводило имя пользователя или аноним в меню на любой странице сайта. Я конечно могу написать эту проверку в каждом контроллере которые отвечают за разные разделы сайта, но что-то мне подсказывает что это не правильное решение и должно быть другое. Может кто-то посоветует как лучше поступить в такой ситуации?
@Controller
public class MainController {

    @GetMapping("/index")
    public String homePage(@AuthenticationPrincipal User user, Model model){
        if(user != null){
            model.addAttribute("user", user.getUsername());
            return "/index";
        } else {
            model.addAttribute("user", "Аноним");
            return "/index";
        }
    }
}
  • Вопрос задан
  • 136 просмотров
Решения вопроса 1
azerphoenix
@azerphoenix Куратор тега Java
Java Software Engineer
Добрый день!
Возможно, что это не самое лучшее решение, но я бы сделал это следующим образом:
Я бы использовал @ControllerAdvice

@ControllerAdvice
public class GlobalControllerAdvice {

    // Текущий авторизованный пользователь
    @ModelAttribute("user")
    public User getUserProfile(
            @AuthenticationPrincipal UserDetails currentUser
    ) {
        if(
                SecurityContextHolder.getContext().getAuthentication() != null &&
                SecurityContextHolder.getContext().getAuthentication().isAuthenticated() &&
                !(SecurityContextHolder.getContext().getAuthentication() instanceof AnonymousAuthenticationToken)

        ) {
            return (User) userService.findUserByEmail(currentUser.getUsername());
        } else {
            return null;
        }

    }

}


Соответственно, если пользователь авторизован, то вы получите user, а если нет, то null.
Ну и дальше в любом шаблоне можете выводить информацию о пользователе БЕЗ использование этого кода для каждого контроллера:
if(user != null){
            model.addAttribute("user", user.getUsername());
            return "/index";
        } else {
            model.addAttribute("user", "Аноним");
            return "/index";
        }
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы