Создайте класс role и свяжите user с ролями так чтобы юзер мог иметь несколько ролей

Обновлено: 29.06.2022

И снова день добрый. Пост в продолжение публикации «Spring + Java EE + Persistence, без XML. Часть 1».

1. Введение

1.1 Подгружаем проект

1.2 Что мы будем делать в этой части?

2. Фиксим распределение ролей между пользователями

2.1 Работа с базой

2.2 Пишем код

3. Создаем контроллер UsersController

3.1 Реализуем создание нового пользователя

3.2 Добавляем работу с конкретным пользователем

4. Для желающих запустить готовый проект

5 Заключение

1. Введение

1.1 Подгружаем проект

1.2 Что мы будем делать в этой части?


В этой части мы рассмотрим как хранятся отношения многие-ко-многим на уровне объектов сущностей;
доделаем распределения прав пользователям;
сделаем простейший REST-controller;
сделаем регистрацию новых пользователей (только для админа);
и все это без XML.

2 Фиксим распределение ролей между пользователями

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

2.1 Работа с базой

Для начала заведем табличку roles (id, role), не забыв указать что значения в role должны быть уникальными. Также создадим вспомогательную таблицу users_roles(user_id, role_id). И сразу же создадим базовые роли ADMIN, USER, GUEST. Ну и сразу создадим для связывающей страницы внешние ключи user_id -> user.id, role_id -> role.id. Все это можно сделать сразу, выполнив вот такой скрипт:

2.2 Пишем код

Сначала зайдем Application.class и уточним расположение Jpa репозиториев:


Теперь создадим в entities/ класс Role замапленный на запись в базе:

Ок, а как теперь свзать их с классом User? Для этого нужно всего лишь добавить в User вот такой код:


Здесь мы указываем таблицу связи двух сущностей, какая колонка в этой таблице соответствует нашей сущности( joinColumns = < @JoinColumn(name = «user_id»)>), а какая — связываемой сущности: inverseJoinColumns = @JoinColumn(name = «role_id»).

В классе Role все проще:


Чтобы Spring устроила наша роль как Authorithy, надо в классе Role реализовать интерфейс GrantedAuthority:


Готово! Теперь мы можем переписать MySQLUserDetailsService:


Теперь мы грузим authorities через user.getRoles(), а не мусорный класс, так что пользователь получит только те роли, которые присвоены ему в базе.

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

Итак, создадим простенький rest controller для работы с пользователями доступный только для пользователей с правами админа.

3. Создаем контроллер UsersController

Для начала создадим папку controllers, а в ней — UsersContoller:


Итак, во первых мы отметили что это контроллер rest, что значит что возвращать он будет не полноценные html странички, а сырые данные, по умолчанию в формате Json. @RequestMapping("/users") — это означает, что срабатывать он будет на зпрос от пользователя вида «yoursite/users». Но мы тут собираемся пользователями рулить, в то время как открыть этот контроллер может любой авторизованный пользоватль! Так что добавляем волшебную строчку:


Внутри контроллера проверка прав теперь вообще не нужна, туда попасть сможет только тот у кого уже роль ADMIN имеется.

Теперь добавим вывод всех пользователей:


Ок, теперь добавим еще парочку методов и «user-friendly» интерфейс для создания новых пользователей.

3.1 Реализуем создание нового пользователя

Для этого сначала реализуем метод который по POST запросу добавит новую сущность:


Уже неплохо, из стороннего api теперь можно пост запросом юзеров добавлять, а как в самом нашем приложении это делать?

Для этого создадим вложенный маршрут /add, который будет отрабатывать по запросу GET /users/add:


И в resources/templates/ добавим add.html:


Поля формы будут напрямую конвертироваться в параметры функции создания пользователя с таким же названием, крайне удобно, по-моему.

Напрямую вывести шаблон в @RestController мы не можем, так что используем для этого вспомогательный класс ModelAndView в который достаточно передать название view (без.html).

Готово, теперь можно напрямую на сайте создавать новых пользователей с помощью rest либо с помощью формы в /users/add.

3.2 Добавляем работу с конкретным пользователем

Осталось добавить два простейших метода которые выдают/удаляют конкретного пользователя(запрос типа GET/DELETE /users/2):


Данные методы по-моему самодокументируемы. Аннотация PathVariable(«значение») вытаскивает из запроса то, что будет в нем вместо шаблона (в нашем случае — цифра).

4. Для желающих запустить готовый проект

5. Заключение

Хотелось уместить в этой статье сильно больше, на она по-моему и так уже слегка перегружена, а я еще даже до половины не дошел. Так что тестирование, OneToMany и еще несколько интересных вещей придется оставить на следующую статью, если, конечно, будет интерес к теме.

This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Latest commit

Git stats

Files

Failed to load latest commit information.

readme.md

Практическая задача Условие: Склонируйте заготовку проекта по ссылке и просмотрите его. Модуль Spring Security позволяет нам внедрять права доступа, а также контролировать их исполнение без ручных проверок. Spring Security базируется на 2х интерфейсах, которые определяют связь сущностей с секьюрностью: UserDetails и GrantedAuthority. UserDetails - то, что будет интерпретироваться системой как пользователь. GrantedAuthority - сущность, описывающая права юзера. Оба эти интерфейса имеют множество реализаций: просмотрите класс SecurityConfig, в методе configure() с помощью настроек inMemoryAuthentication() мы собираем единственный на всю программу экземпляр UserDetails с именем и паролем админ-админ, а его роль “ADMIN” так же будет преобразована в экземпляр GrantedAuthority. Это простейший способ создания секьюрности. Так же мы можем использовать jdbc-аутентификацию путем написания запроса, возвращающего пользователя и роль. Как вы понимаете, такие способы максимально просты, но лишены достаточной гибкости, потому наиболее часто используемый вариант настройки выглядит как имплементация UserDetails и GrantedAuthority в классах-сущностях с переопределением существующих методов.

This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

  • Open with Desktop
  • View raw
  • Copy raw contents Copy raw contents

Copy raw contents

Copy raw contents

Java pre-project. Практическая задача 2.4.2

Initial login data is admin : admin




Модуль Spring Security позволяет нам внедрять права доступа, а также контролировать их исполнение без ручных проверок.

Spring Security базируется на 2х интерфейсах, которые определяют связь сущностей с секьюрностью: UserDetails и GrantedAuthority.

UserDetails - то, что будет интерпретироваться системой как пользователь.

GrantedAuthority - сущность, описывающая права юзера.

Оба эти интерфейса имеют множество реализаций: просмотрите класс SecurityConfig, в методе configure() с помощью настроек inMemoryAuthentication() мы собираем единственный на всю программу экземпляр UserDetails с именем и паролем админ-админ, а его роль “ADMIN” так же будет преобразована в экземпляр GrantedAuthority.

Это простейший способ создания секьюрности. Так же мы можем использовать jdbc-аутентификацию путем написания запроса, возвращающего пользователя и роль.

Как вы понимаете, такие способы максимально просты, но лишены достаточной гибкости, потому наиболее часто используемый вариант настройки выглядит как имплементация UserDetails и GrantedAuthority в классах-сущностях с переопределением существующих методов.

Модуль Spring Security позволяет нам внедрять права доступа, а также контролировать их исполнение без ручных проверок.

Spring Security базируется на 2-х интерфейсах, которые определяют связь сущностей с секьюрностью: UserDetails и GrantedAuthority.

UserDetails - то, что будет интерпретироваться системой как пользователь.

GrantedAuthority - сущность, описывающая права юзера.

Оба интерфейса имеют множество реализаций: просмотрите класс SecurityConfig, в методе configure() с помощью настроек inMemoryAuthentication() мы собираем единственный на всю программу экземпляр UserDetails с именем и паролем админ-админ, а его роль “ADMIN” так же будет преобразована в экземпляр GrantedAuthority.

Это простейший способ создания секьюрности. Также мы можем использовать jdbc-аутентификацию путем написания запроса, возвращающего пользователя и роль.

Как вы понимаете, такие способы максимально просты, но лишены достаточной гибкости, потому наиболее часто используемый вариант настройки выглядит как имплементация UserDetails и GrantedAuthority в классах-сущностях с переопределением существующих методов.

Java pre-project. Практическая задача 2.4.2

Initial login data is admin : admin




Модуль Spring Security позволяет нам внедрять права доступа, а также контролировать их исполнение без ручных проверок.

Spring Security базируется на 2х интерфейсах, которые определяют связь сущностей с секьюрностью: UserDetails и GrantedAuthority.

UserDetails - то, что будет интерпретироваться системой как пользователь.

GrantedAuthority - сущность, описывающая права юзера.

Оба эти интерфейса имеют множество реализаций: просмотрите класс SecurityConfig, в методе configure() с помощью настроек inMemoryAuthentication() мы собираем единственный на всю программу экземпляр UserDetails с именем и паролем админ-админ, а его роль “ADMIN” так же будет преобразована в экземпляр GrantedAuthority.

Это простейший способ создания секьюрности. Так же мы можем использовать jdbc-аутентификацию путем написания запроса, возвращающего пользователя и роль.

Как вы понимаете, такие способы максимально просты, но лишены достаточной гибкости, потому наиболее часто используемый вариант настройки выглядит как имплементация UserDetails и GrantedAuthority в классах-сущностях с переопределением существующих методов.

Читайте также: