Spring boot, security, data Java School

1.

Spring boot, security, data
Java School
28 Feb 2022
Калёнов
Владимир

2.

Agenda
01
Spring Boot
02
Spring Security
03
Spring Data

3.

Spring boot
Spring Boot – специальный фреймворк для
быстрого создания production-grade приложений
• Spring заменяет конфигурированием программирование
типовых задач (работа с базами данных, очередями,
логирование, web-инфраструктура, мониторинг и т.д.)
• Stand-alone приложения c embedded Tomcat, Jetty, Undertow
• Spring Boot предоставляет опциональные 'starter’-ы для
упрощения добавления зависимостей в Maven
Почему Spring Boot?
• Быстрый старт разработки за счет автоконфигураций
• Минимальный порог входа. Чтобы делать простые микросервисы можно не
знать о существовании: TomCat, Servlets, Hibernate, Jdbc, да и просто о
некоторых частях Java.
3

4.

Spring boot
Как сделать первое приложение?
• Воспользоваться https://start.spring.io
• То же самое, но через IntelliJ IDEA
• Воспользоваться другим приложением как шаблоном
4

5.

Spring boot
@SpringBootApplication включает в себя несколько аннотаций. Самая
интересная EnableAutoConfiguration
• Аннотация запускает поиск «Auto-configuration» бинов, т.е. бинов,
отмеченных аннотациями @Conditional*
• @Conditional* это мощная возможность Spring Boot для авто
конфигурации приложения
5

6.

Spring boot
https://www.baeldung.com/spring-boot-custom-autoconfiguration
6

7.

Spring boot
• Yet Another Markup Language
• .yml и .yaml
• Чтобы хорошо читался машиной и человеком
• Очень удобен (особенно массивы)
7

8.

Spring boot
Профили
• Иногда бывает так, что приложение должно
запускаться в разных вариантах
• Иногда это разные БД
• Иногда staging окружения - dev, test, prod, …
• Свойства, переменные с одинаковыми именами в
разных профайлах перегружают друг друга
8

9.

Spring boot
Задание 1
Скачать репозиторий: https://gitlab.com/exercises6/boot.git
Доконфигурить класс MessageConfig, основываясь на свойства «create» в application.yml
В классе MessageService вместо «?» подставить нужный тип для переменной message
Так чтобы управлять выводом сообщений {"message":"Hello World"},{"message":"Hello TSystems"} в браузере по адресу http://localhost:8081/hello из application.yml
• С помощью профайлов расширить выводимое значение именем Person
9

10.

Spring boot
Задание 2
• Сгенерируйте баннер - http://patorjk.com/software/taag/
• Скопируйте и положите в ./src/main/resources/banner.txt
10

11.

Q&A
Session

12.

Spring security
Задание 3
• Добавить в приложение зависимость
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
• Попробовать перейти по урлу http://localhost:8081/hello
• Что получили?
12

13.

Spring security
• При включении любого бут стартера в POM-файл ничего не дает
• НО в Spring Security все иначе:
• Spring Security создает пользователя с именем user и
автоматически сгенерированным паролем, который можно
посмотреть в консоли.
• Создается страница с формой для ввода имени и пароля имеем Form-based аутентификацию.
• Все url оказываются недоступны, пока мы не «залогинимся»
под этим пользователем.
• И еще создается страница, где можно «разлогиниться». Она находится по адресу logout
• Cтраница входа генерируется в классе
org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter
13

14.

Spring security
Аутентификация — это проверка пользователя на то, является ли
он тем, кем себя выдает
Авторизация — это выдача прав (либо отказ). Происходит уже после того,
как пользователь подтвердил свою идентичности
14

15.

Spring security
In-Memory аутентификации
• Аутентификацию выполняет AuthenticationManager,
но определять этот бин явно нам не надо
• Вместо этого надо переопределить метод
configure(AuthenticationManagerBuilder auth)
15

16.

Spring security
password encoder
• Пароли нельзя хранить в открытом виде в коде, только в хэшированном
• В Spring Security используется BCryptPasswordEncoder
16

17.

Spring security
In-Memory аутентификации
17

18.

Spring security
авторизация
Приложение проверяет, какие стоят права у данного пользователя, и либо
впускает его, либо нет.
18

19.

Spring security
авторизация
Перечислять шаблоны надо в порядке от самых узкоохватывающих до широкоохватывающих:
19

20.

Spring security
авторизация
20

21.

Spring security
задание 3
• Выкачать репозиторий: https://gitlab.com/exercises6/security
• Настроить in memory аутентификацию
• Не забываем, что пароли в коде нужно хранить в зашифрованном виде
• Генератор паролей https://bcrypt-generator.com/
• И авторизацию:
• к страничке «/public» имеет доступ любой пользователь
• к страничке «/user» имеет доступ пользователь с ролью user
• к страничке «/admin» имеет доступ пользователь с ролью admin
21

22.

Spring security
In Memory аутентификация:
• Проста
• Полезна для экспериментов во время разработки
• Но не годится для реальных проектов
Пользовательская аутентификация:
• Реализуем пользовательский UserDetailsService — то есть напишем метод
loadUserByUsername(). По сути тут надо всего лишь реализовать извлечение пользователя
из базы.
• Реализуем пользовательский AuthenticationProvider. Тут надо переопределить метод
authenticate(Authentication authentication). То есть помимо извлечения пользователя из базы,
мы будем сами сравнивать пароли и формировать объект Authentication (либо выбрасывать
исключение).
22

23.

Spring security
23

24.

Spring security
задание 4
• Выкачать репозиторий: https://gitlab.com/exercises6/security
• Настроить пользовательскую аутентификацию на основе UserDetailsService
• Для этого нужно создать своего UserDatails и перегрузить метод
loadUserByUsername
• Не забываем, что из БД можем получить null при вызове из сервиса нужного
персона по логину.
24

25.

Spring security
25

26.

Spring security
основные компоненты
• SecurityContextHolder – в нем содержится информация о текущем контексте безопасности
приложения, который включает в себя подробную информацию о пользователе(Principal)
работающем в настоящее время с приложением
• SecurityContext – содержит объект Authentication и в случае необходимости информацию
системы безопасности, связанную с запросом от пользователя
• Authentication – представляет пользователя (Principal) с точки зрения Spring Security
• UserDetails – предоставляет необходимую информацию для построения объекта Authentication
из DAO объектов приложения или других источников данных системы безопасности
• UserDetailsService – используется чтобы создать UserDetails объект путем реализации
loadUserByUsername(String username) метода этого интерфейса
• GrantedAuthority – отражает разрешения выданные пользователю в масштабе всего
приложения (роли)
26

27.

Spring security
Аутентификация
Приходит запрос
В UsernamePasswordAuthenticationToken сохраняются
введенные пользователем логин и пароль
AuthenticationManager получает на вход объект Authentication.
• Имя хранится в principal, пароль credenticals
• isAuthenticated() до аутентификации равно false
Делегируется проверка конкретным провайдерам
Проходит аутентификация:
• AuthenticationProvider
• UserDetailsService
Если аутентификация не прошла (имя и пароль неверны), то
выбрасывается исключение BadCredentials.
В случае же успеха возвращается тоже объект Authentication:
• principal = UserDetails
• isAuthenticated() = true
• credentials = null
Объект Authentication сохраняется в SecurityContext, а тот, в
свою очередь, — в SecurityContextHolder
27

28.

Spring security
28

29.

Spring security
Delegating Filter Proxy
• Интегрирует цепочки фильтров в последовательность обработки HTTP запроса
• Единственная задача – вызов цепочки фильтров Spring Security
29

30.

Spring security
Фильтры Spring Security
ChannelProcessingFilter – если по HTTP, то перенаправляет на HTTPS
ConcurrentSessionFilter – защита от повторяющихся сессий
SecurityContextPersistenceFilter – создаёт Security-контекст
Фильтр(ы) аутентификации – их тьма
RememberMeAuthenticationFilter – вторичная аутентификация «Запомни меня»
AnonymousAuthenticationFilter – тоже вторичная аутентификация
ExceptionTranslationFilter – обрабатывает исключения
FilterSecurityInterceptor – а вот он как раз занимается безопасностью
30

31.

Q&A
Session

32.

Spring data
jdbc
32

33.

Spring data
jpa (с реализацией hibernate)
33

34.

Spring data
34

35.

Spring data
35

36.

Spring DATA
Spring Data Repositories:
• CrudRepository предоставляет функции CRUD
• PagingAndSortingRepository предоставляет методы для разбиения
на страницы и сортировки записей
• JpaRepository предоставляет связанные с JPA методы, такие как
очистка контекста сохранения и удаление записей в пакете
36

37.

Spring data
Предоставляет все основные абстракции
запросов, необходимые в приложении.
37

38.

Spring data
38

39.

Spring data
39

40.

Spring data
40

41.

Spring data
41

42.

Spring data
Задание 5
• select * from students where age=18
• Хотим узнать всех студентов 5 курса сдавших экзамен на
отлично
• Нужно найти все машины старше 5 лет
42

43.

Spring data
ответы
• List<Student> findByAge(18)
• List<Student> findByCourseAndMark (5,”отлично”)
• List<Cars> findByAgeGreaterThen(5)
43

44.

Spring data
44

45.

Spring data
кастомизация
45

46.

Spring data
Собственные методы
46

47.

Spring data
задание 5
• Выкачать репозиторий: https: https://gitlab.com/exercises6/data.git
• Написать необходимые методы в PersonDao, так чтобы:
• При обращении по /user/Ivan получили возраст Ивана
• При обращении по /user?start=20&end=30 получили Jack
47

48.

Q&A
Session

49.

Thanks for your
attention!

50.

Spring security references
https://sysout.ru/kak-ustroena-autentifikatsiya-v-spring-security/
https://sysout.ru/polzovatelskaya-autentifikatsiya/
https://www.baeldung.com/security-spring
https://habr.com/ru/company/otus/blog/488418/
https://devcolibri.com/%D0%B1%D1%8B%D1%81%D1%82%D1%80%D1%8
B%D0%B9-%D1%81%D1%82%D1%80%D0%B0%D1%82-%D0%B2-springsecurity/
http://spring-projects.ru/guides/securing-web/
https://www.youtube.com/watch?v=Tq9pY8hPjTk&list=PLaWfw53gNyzaDTEmrlCC
j1jjqr6770Nnp&index=12
50
English     Русский Правила