Similar presentations:
Spring boot, security, data Java School
1.
Spring boot, security, dataJava School
28 Feb 2022
Калёнов
Владимир
2.
Agenda01
Spring Boot
02
Spring Security
03
Spring Data
3.
Spring bootSpring 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 boothttps://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&ASession
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 securityIn-Memory аутентификации
• Аутентификацию выполняет AuthenticationManager,
но определять этот бин явно нам не надо
• Вместо этого надо переопределить метод
configure(AuthenticationManagerBuilder auth)
15
16.
Spring securitypassword encoder
• Пароли нельзя хранить в открытом виде в коде, только в хэшированном
• В Spring Security используется BCryptPasswordEncoder
16
17.
Spring securityIn-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 securityIn Memory аутентификация:
• Проста
• Полезна для экспериментов во время разработки
• Но не годится для реальных проектов
Пользовательская аутентификация:
• Реализуем пользовательский UserDetailsService — то есть напишем метод
loadUserByUsername(). По сути тут надо всего лишь реализовать извлечение пользователя
из базы.
• Реализуем пользовательский AuthenticationProvider. Тут надо переопределить метод
authenticate(Authentication authentication). То есть помимо извлечения пользователя из базы,
мы будем сами сравнивать пароли и формировать объект Authentication (либо выбрасывать
исключение).
22
23.
Spring security23
24.
Spring securityзадание 4
• Выкачать репозиторий: https://gitlab.com/exercises6/security
• Настроить пользовательскую аутентификацию на основе UserDetailsService
• Для этого нужно создать своего UserDatails и перегрузить метод
loadUserByUsername
• Не забываем, что из БД можем получить null при вызове из сервиса нужного
персона по логину.
24
25.
Spring security25
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 security28
29.
Spring securityDelegating Filter Proxy
• Интегрирует цепочки фильтров в последовательность обработки HTTP запроса
• Единственная задача – вызов цепочки фильтров Spring Security
29
30.
Spring securityФильтры Spring Security
ChannelProcessingFilter – если по HTTP, то перенаправляет на HTTPS
ConcurrentSessionFilter – защита от повторяющихся сессий
SecurityContextPersistenceFilter – создаёт Security-контекст
Фильтр(ы) аутентификации – их тьма
RememberMeAuthenticationFilter – вторичная аутентификация «Запомни меня»
AnonymousAuthenticationFilter – тоже вторичная аутентификация
ExceptionTranslationFilter – обрабатывает исключения
FilterSecurityInterceptor – а вот он как раз занимается безопасностью
30
31.
Q&ASession
32.
Spring datajdbc
32
33.
Spring datajpa (с реализацией hibernate)
33
34.
Spring data34
35.
Spring data35
36.
Spring DATASpring Data Repositories:
• CrudRepository предоставляет функции CRUD
• PagingAndSortingRepository предоставляет методы для разбиения
на страницы и сортировки записей
• JpaRepository предоставляет связанные с JPA методы, такие как
очистка контекста сохранения и удаление записей в пакете
36
37.
Spring dataПредоставляет все основные абстракции
запросов, необходимые в приложении.
37
38.
Spring data38
39.
Spring data39
40.
Spring data40
41.
Spring data41
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 data44
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&ASession
49.
Thanks for yourattention!
50.
Spring security referenceshttps://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