Главная страница

ОглавлениеCore


Скачать 1.53 Mb.
НазваниеОглавлениеCore
Дата17.05.2023
Размер1.53 Mb.
Формат файлаpdf
Имя файлаpolnaya_metodichka (1).pdf
ТипДокументы
#1138113
страница24 из 25
1   ...   17   18   19   20   21   22   23   24   25
Как работает Spring Security? Как сконфигурировать? Какие интерфейсы
используются?
Кратко:
Основными блоками Spring Security являются:

SecurityContextHolder, чтобы обеспечить доступ к SecurityContext;

SecurityContext содержит объект Authentication и в случае необходимости информацию системы безопасности, связанную с запросом;

Authentication представляет принципала с точки зрения Spring Security;

GrantedAuthority отражает разрешения, выданные доверителю в масштабе всего приложения;


UserDetails предоставляет необходимую информацию для построения объекта
Authentication из DAO-объектов приложения или других источника данных системы безопасности;

UserDetailsService создает UserDetails, если передано имя пользователя в виде
String (или идентификатор сертификата или что-то подобное).
Подробно:
Самым фундаментальным является SecurityContextHolder. В нем храним информацию о текущем контексте безопасности приложения, который включает в себя подробную информацию о пользователе, работающем с приложением. По умолчанию
SecurityContextHolder использует MODE_THREADLOCAL для хранения такой информации.
Это означает, что контекст безопасности всегда доступен для методов, исполняющихся в том же самом потоке, даже если контекст безопасности явно не передается в качестве аргумента этих методов:
SecurityContextHolder.getContext().getAuthentication().getPrincipal();
UserDetails выступает в качестве принципала.
MODE_GLOBAL – все потоки Java-машины используют один контекст безопасности.
MODE_INHERITABLETHREADLOCAL – потоки, порожденные от одного защищенного потока, наличие аналогичной безопасности.
Интерфейс UserDetailsService – подход к загрузке информации о пользователе в Spring
Security. Единственный метод этого интерфейса принимает имя пользователя в виде String и возвращает UserDetails. Он представляет собой принципала, но в расширенном виде и с учетом специфики приложения.
В случае успешной аутентификации UserDetails используется для создания Authentication объекта, который хранится в SecurityContextHolder.
Еще одним важным методом Authentication явлется getAuthorities() – массив объектов
GrantedAuthority (роли).
Credentials – под ними понимаются пароль пользователя, но им может быть и отпечаток пальца, фото сетчатки и т. п.
Процесс аутентификации:
1. UsernamePasswordAuthenticationFilter получают имя пользователя и пароль и создает экземпляр класса UsernamePasswordAuthenticationToken (экземпляр интерфейса
Authentication).
2. Токен передается экземпляру AuthenticationManager для проверки.
3. AuthenticationManager возвращает полностью заполненный экземпляр Authentication в случае успешной аутентификации.
4. Устанавливается контекст безопасности через вызов
SecurityContextHolder.getContext().setAuthentication(...), куда передается вернувшийся экземпляр Authentication.
5. При успешной аутентификации можно использовать successHandler.

Что такое SpringBoot? Какие у него преимущества? Как конфигурируется?
Подробно
Spring Boot – это модуль Spring-а, который предоставляет функцию RAD для среды Spring
(Rapid Application Development – быстрая разработка приложений). Он обеспечивает более простой и быстрый способ настройки и запуска как обычных, так и веб-приложений. Он просматривает пути к классам и настроенные бины, делает разумные предположения о том,
чего не хватает, и добавляет эти элементы.
Ключевые особенности и преимущества Spring Boot:
1. Простота управления зависимостями (spring-boot-starter-* в pom.xml).
Чтобы ускорить процесс управления зависимостями Spring Boot неявно упаковывает необходимые сторонние зависимости для каждого типа приложения на основе Spring и предоставляет их разработчику в виде так называемых starter-пакетов.
Starter-пакеты представляют собой набор удобных дескрипторов зависимостей, которые можно включить в приложение. Это позволяет получить универсальное решение для всех технологий, связанных со Spring, избавляя программиста от лишнего поиска необходимых зависимостей, библиотек и решения вопросов, связанных с конфликтом версий различных библиотек.
Например, если необходимо начать использовать Spring Data JPA для доступа к базе данных, можно просто включить в проект зависимость spring-boot-starter-data-jpa.
Starter-пакеты можно создавать и свои.
2. Автоматическая конфигурация.
Автоматическая конфигурация включается аннотацией @EnableAutoConfiguration (входит в состав аннотации @SpringBootApplication).
После выбора необходимых для приложения starter-пакетов Spring Boot попытается автоматически настроить Spring-приложение на основе выбранных jar-зависимостей,
доступных в classpath классов, свойств в application.properties и т. п. Например, если добавим springboot-starter-web, то Spring boot автоматически сконфигурирует такие бины, как
DispatcherServlet, ResourceHandlers, MessageSource и т. д.
Автоматическая конфигурация работает в последнюю очередь после регистрации пользовательских бинов и всегда отдает им приоритет. Если код уже зарегистрировал бин
DataSource, автоконфигурация не будет его переопределять.
3. Встроенная поддержка сервера приложений/контейнера сервлетов (Tomcat, Jetty).
Каждое Spring Boot web-приложение включает встроенный web-сервер. Не нужно беспокоиться о настройке контейнера сервлетов и развертывания приложения в нем. Теперь приложение может запускаться само как исполняемый .jar-файл с использованием встроенного сервера.
4. Готовые к работе функции, такие как метрики, проверки работоспособности, security и внешняя конфигурация.
5. Инструмент CLI (command-line interface) для разработки и тестирования приложения
Spring Boot.
6. Минимизация boilerplate кода (код, который должен быть включен во многих местах практически без изменений), конфигурации XML и аннотаций.

Как происходит автоконфигурация в Spring Boot:
1. Отмечаем main-класс аннотацией
@SpringBootApplication
(аннотация инкапсулирует в себя:
@SpringBootConfiguration, @ComponentScan,
@EnableAutoConfiguration), таким образом наличие @SpringBootApplication включает сканирование компонентов, автоконфигурацию и показывает разным компонентам Spring (например, интеграционным тестам), что это приложение Spring
Boot.
2. @EnableAutoConfiguration импортирует класс EnableAutoConfigurationImportSelector.
Этот класс не объявляет бины сам, а использует фабрики.
3. Класс EnableAutoConfigurationImportSelector импортирует ВСЕ (более 150)
перечисленные в META-INF/spring.factories конфигурации, чтобы предоставить нужные бины в контекст приложения.
4. Каждая из этих конфигураций пытается сконфигурировать различные аспекты приложения (web, JPA, AMQP и т. д.), регистрируя нужные бины. Логика при регистрации бинов управляется набором @ConditionalOn* аннотаций. Можно указать,
чтобы бин создавался при наличии класса в classpath (@ConditionalOnClass), наличии существующего бина
(@ConditionalOnBean),
отсутствии бина
(@ConditionalOnMissingBean) и т. п. Таким образом, наличие конфигурации не значит,
что бин будет создан и зачастую конфигурация ничего делать и создавать не будет.
5. Созданный в итоге AnnotationConfigEmbeddedWebApplicationContext ищет в том же
DI- контейнере фабрику для запуска embedded servlet container.
6. Servlet container запускается, приложение готово к работе.
Расскажите про нововведения Spring 5

используется JDK 8+ (Optional, CompletableFuture, Time API, java.util.function, default methods);

поддержка Java 9 (Automatic-Module-Name in 5.0, module-info in 6.0+, ASM 6);

поддержка HTTP/2 (TLS, Push), NIO/NIO.2;

поддержка Kotlin;

реактивность (веб-инфраструктура с реактивным стеком, «Spring WebFlux»);

Null-safety аннотации(@Nullable), новая документация;

совместимость с Java EE 8 (Servlet 4.0, Bean Validation 2.0, JPA 2.2, JSON Binding API
1.0);

поддержка JUnit 5 + Testing Improvements (conditional and concurrent);

удалена поддержка Portlet, Velocity, JasperReports, XMLBeans, JDO, Guava.

Паттерны
Что такое «шаблон проектирования»?
Проверенное и готовое к использованию логическое решение, которое может быть реализовано по-разному в разных языках программирования.
Плюсы:

снижение сложности разработки за счет готовых абстракций;

облегчение коммуникации между разработчиками.
Минусы:

слепое следование некоторому шаблону может привести к усложнению программы;

желание попробовать некоторый шаблон в деле без особых на то оснований.
Назовите основные характеристики шаблонов

имя – все шаблоны имеют уникальное имя, служащее для их идентификации;

назначение данного шаблона;

задача, которую шаблон позволяет решить;

способ решения, предлагаемый в шаблоне для решения задачи в том контексте, где этот шаблон был найден;

участники – сущности, принимающие участие в решении задачи;

следствия от использования шаблона как результат действий, выполняемых в шаблоне;

реализация – возможный вариант реализации шаблона.
Назовите три основные группы паттернов
Порождающие – отвечают за удобное и безопасное создание новых объектов или даже целых семейств объектов без внесения в программу лишних зависимостей.
Структурные – отвечают за построение удобных в поддержке иерархий классов.
Поведенческие – заботятся об эффективной коммуникации между объектами.
Основные – основные строительные блоки, используемые для построения других шаблонов. Например, интерфейс.
Расскажите про паттерн «Одиночка» (Singleton)
Порождающий паттерн проектирования, который гарантирует, что у класса есть только один экземпляр, и предоставляет к нему глобальную точку доступа.
Конструктор помечается как private, а для создания нового объекта Singleton использует специальный метод getInstance(). Он либо создает объект, либо отдаёе существующий объект, если он уже был создан.
private static Singleton instance;

public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
Плюсы:

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

нарушает принцип единой ответственности, так как его могут использовать множество объектов.
Почему считается антипаттерном?

нельзя тестировать с помощью mock, но можно использовать powerMock;

нарушает принцип единой ответственности;

нарушает Open/Close принцип, его нельзя расширить.
Можно ли его синхронизировать без synchronized у метода?
1. Можно сделать его Enum (eager). Это статический final класс с константами. JVM
загружает final и static классы на этапе компиляции, а значит несколько потоков не могут создать несколько инстансов.
2. C помощью double checked locking (lazy). Synchronized внутри метода:
private static volatile Singleton instance;
public static Singleton getInstance() {
Singleton localInstance = instance;
if (localInstance == null) { // first check
synchronized (Singleton.class) {
localInstance = instance;
if (localInstance == null) { // second check
instance = localInstance = new Singleton();
}
}
}
return localInstance;
}

Расскажите про паттерн «Строитель» (Builder)
Порождающий паттерн, который позволяет создавать сложные объекты пошагово.
Строитель дает возможность использовать один и тот же код для получения разных представлений одного объекта.
Паттерн предлагает вынести конструирование объекта за пределы его собственного класса,
поручив это дело отдельным объектам, называемым строителями.
Процесс конструирования объекта разбит на отдельные шаги (например, построитьСтены,
вставитьДвери). Чтобы создать объект, нужно поочередно вызывать методы строителя.
Причем не нужно запускать все шаги, а только те, что нужны для производства объекта определенной конфигурации.
Можно пойти дальше и выделить вызовы методов строителя в отдельный класс,
называемый Директором. В этом случае Директор будет задавать порядок шагов строительства, а строитель – выполнять их.
Плюсы:

позволяет использовать один и тот же код для создания различных объектов;

изолирует сложный код сборки объектов от его основной бизнес-логики.
Минусы:

усложняет код программы из-за введения дополнительных классов.
Расскажите про паттерн «Фабричный метод» (Factory Method)
Порождающий шаблон проектирования, в котором подклассы имплементируют общий интерфейс с методом для создания объектов. Переопределенный метод в каждом наследнике возвращает нужный вариант объекта.
Объекты все равно будут создаваться при помощи new, но делать это будет фабричный метод. Таким образом можно переопределить фабричный метод в подклассе, чтобы изменить тип создаваемого продукта.
Чтобы эта система заработала, все возвращаемые объекты должны иметь общий интерфейс. Подклассы смогут производить объекты различных классов, следующих одному и тому же интерфейсу.
Плюсы:

выделяет код производства объектов в одно место, упрощая поддержку кода;

реализует принцип открытости/закрытости.
Минусы:

может привести к созданию больших параллельных иерархий классов, так как для каждого класса продукта надо создать свой подкласс создателя.
Пример: SessionFactory в Hibernate.
Расскажите про паттерн «Абстрактная фабрика» (Abstract Factory)
Порождающий паттерн проектирования, который представляет собой интерфейс для создания других классов, не привязываясь к конкретным классам создаваемых объектов.

Абстрактная фабрика предлагает выделить общие интерфейсы для отдельных продуктов,
составляющих семейства. Так, все вариации кресел получат общий интерфейс Кресло, все диваны реализуют интерфейс Диван и так далее.
Далее создается абстрактная фабрика – общий интерфейс, который содержит фабричные методы создания всех продуктов семейства (например, создатьКресло, создатьДиван и создатьСтолик). Эти операции должны возвращать абстрактные типы продуктов,
представленные интерфейсами, которые выделили ранее – Кресла, Диваны и Столики.
Плюсы:

гарантированно будет создаваться тип одного семейства.
Минусы:

усложняет код программы из-за введения множества дополнительных классов.
Расскажите про паттерн «Прототип» (Prototype)
Порождающий паттерн проектирования, который позволяет копировать объекты, не вдаваясь в подробности их реализации.
Паттерн поручает создание копий самим копируемым объектам. Он вводит общий интерфейс с методом clone для всех объектов, поддерживающих клонирование. Реализация этого метода в разных классах очень схожа. Метод создает новый объект текущего класса и копирует в него значения всех полей собственного объекта.
Плюсы:

позволяет клонировать объекты, не привязываясь к их конкретным классам.
Минусы:

сложно клонировать составные объекты, имеющие ссылки на другие объекты.
Расскажите про паттерн «Адаптер» (Adapter)
Структурный паттерн проектирования, который позволяет объектам с несовместимыми интерфейсами работать вместе.
Это объект-переводчик, который трансформирует интерфейс или данные одного объекта в такой вид, чтобы он стал понятен другому объекту.
При этом адаптер оборачивает один из объектов так, что другой объект даже не знает о наличии первого.
Плюсы:

отделяет и скрывает от клиента подробности преобразования различных интерфейсов.
Минусы:

усложняет код программы из-за введения дополнительных классов.
Расскажите про паттерн «Декоратор» (Decorator)
Структурный паттерн проектирования, который позволяет добавлять объектам новую функциональность, оборачивая их в полезные «обертки».

Целевой объект помещается в другой объект-обертку, который запускает базовое поведение обернутого объекта, а затем добавляет к результату что-то свое.
Оба объекта имеют общий интерфейс, поэтому для пользователя нет никакой разницы, с каким объектом работать – чистым или обернутым. Можно использовать несколько разных оберток одновременно – результат будет иметь объединенное поведение всех оберток сразу.
Адаптер не меняет состояния объекта, а декоратор может менять.
Плюсы:

большая гибкость, чем у наследования.
Минусы:

труднее конфигурировать многократно обернутые объекты.
Расскажите про паттерн «Заместитель» (Proxy)
Структурный паттерн проектирования, который позволяет подставлять вместо реальных объектов специальные объекты-заменители, которые перехватывают вызовы к оригинальному объекту, позволяя сделать что-то до или после передачи вызова оригиналу.
Заместитель предлагает создать новый класс-дублер, имеющий тот же интерфейс, что и оригинальный служебный объект. При получении запроса от клиента объект-заместитель сам бы создавал экземпляр служебного объекта, выполняя промежуточную логику, которая выполнялась бы до (или после) вызовов этих же методов в настоящем объекте.
Плюсы:

позволяет контролировать сервисный объект незаметно для клиента.
Минусы:

увеличивает время отклика от сервиса.
Расскажите про паттерн «Итератор» (Iterator)
Поведенческий паттерн проектирования, который дает возможность последовательно обходить элементы составных объектов, не раскрывая их внутреннего представления.
Идея состоит в том, чтобы вынести поведение обхода коллекции из самой коллекции в отдельный класс.
Детали: создается итератор и интерфейс, который возвращает итератор. В классе, в котором надо будет вызывать итератор, имплементируем интерфейс, возвращающий итератор, а сам итератор делаем там нестатическим вложенным классом, так как он нигде использоваться больше не будет.
1   ...   17   18   19   20   21   22   23   24   25


написать администратору сайта