Создайте класс role и свяжите user с ролями так чтобы юзер мог иметь несколько ролей
И снова день добрый. Пост в продолжение публикации «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 в классах-сущностях с переопределением существующих методов.
Читайте также: