@xxxibgdrgn

Как разграничить функционал страницы сайта в зависимости от роли пользователя?

При создании веб приложения на spring fraemwork с помощью spring security создаётся форма аутентификации. Имеется 2 пользователя - админ и юзер. Как в зависимости от роли пользователя, после удачного входа подгружать index.html с разным наполнением? То есть имеются на странице иконки А и Б, которые ведут на другие страницы сайта. Нужно сделать так, чтобы для админа были доступны обе иконки, а для юзера только иконка А.
  • Вопрос задан
  • 1201 просмотр
Пригласить эксперта
Ответы на вопрос 1
azerphoenix
@azerphoenix Куратор тега Spring
Java Software Engineer
Вы можете ограничить функционал на разных уровнях.
Например, можно ограничить функционал на уровне шаблона. Если вы используете шаблонизатор thymeleaf, то скорее вам понадобится добавить в Gradle || Maven -
implementation group: 'org.thymeleaf.extras', name: 'thymeleaf-extras-springsecurity5', version: '3.0.4.RELEASE'

А дальше уже в шаблон вставить - sec:authorize="hasAuthority('ADMIN')"
Например,
<div class="dashboard_rules" sec:authorize="hasAuthority('ADMIN')">
<!-- Увидит только админ-->
</div>


Также можно на уровне контроллера ограничить доступ:
@PreAuthorize("hasAuthority('ADMIN')")

Как в зависимости от роли пользователя, после удачного входа подгружать index.html с разным наполнением?

Я обычно, делаю следующим образом:
После авторизации получаю текущего авторизованного юзера
@AuthenticationPrincipal UserDetails currentUser
Нахожу юзера и проверяю его права:
User user = (User) userService.findUserByEmail(currentUser.getUsername());

Через if() {} else {} отдаю тот или иной контент.
Например,
@GetMapping("/dashboard")
public String dashboard(
        @AuthenticationPrincipal UserDetails currentUser,
        Model model
) {
    model.addAttribute("pageTitle","Панель управления");
    User user = (User) userService.findUserByEmail(currentUser.getUsername());
    if(user.isAdmin()) {
        model.addAttribute("posts", posts.getAdminPosts());
    }  else {
        model.addAttribute("posts", posts.getUserPosts());
    }

    return "backend/dashboard";
}
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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