GPT PP (копия). Spring Security Что такое Spring Security, для чего используется
Скачать 24.67 Kb.
|
Spring Security 1. Что такое Spring Security, для чего используется? 2. Что такое авторизация и аутентификация? 3. Объекты Principal, Authorities, Authentication. 4. Чем отличается InMemoryAuthentication от BasicAuthentication? 5. Как мы можем добавить секьюрность к контроллеру? (минимум 2 способа). Продвинутый Hibernate 6. Связи таблиц @ManyToMany, @ManyToOne, @OneToMany, @OneToOne 7. Как работают каскады для таблиц и какие они бывают? HTTP и REST 8. HTTP протокол – описание, структура запрос и ответа. HTTP-методы и их работа. 9. Архитектура REST и REST-сервисы. Их преимущества и недостатки 10. Форматы данных, использующиеся в REST-сервисах 11. Что такое responseBody, requestBody, ResponseEntity 12. Чем аннотация @RestController отличается от @Controller? 13. RestTemplate и его методы. Front-end 14. Bootstrap – что это такое, описание работы. 15. Что такое AJAX/Fetch JS Spring Security - это фреймворк безопасности для приложений на платформе Spring. Он используется для обеспечения аутентификации и авторизации пользователей, а также для защиты приложения от атак и угроз безопасности. Аутентификация - это процесс проверки подлинности пользователей. Авторизация - это процесс предоставления пользователям прав доступа к определенным ресурсам в системе. Principal - это объект, представляющий аутентифицированного пользователя. Authorities - это объекты, представляющие права доступа пользователя. Authentication - это объект, содержащий информацию об аутентификации пользователя. InMemoryAuthentication используется для хранения учетных данных пользователей в памяти приложения, в то время как BasicAuthentication используется для аутентификации пользователей с использованием HTTP-заголовка. Таким образом, InMemoryAuthentication и BasicAuthentication - это два разных механизма аутентификации, которые используются в разных ситуациях. InMemoryAuthentication хранит учетные данные в памяти приложения, а BasicAuthentication использует HTTP-заголовок для передачи учетных данных между браузером и сервером.(закодированная строка в формате base64 ). Мы можем добавить секьюрность к контроллеру с помощью аннотации @Secured или @RolesAllowed, или с помощью настройки конфигурации Spring Security в файле конфигурации. @ManyToMany - связь многие-ко-многим между двумя таблицами. @ManyToOne - связь многие-к-одному между двумя таблицами. @OneToMany - связь один-ко-многим между двумя таблицами. @OneToOne - связь один-к-одному между двумя таблицами. Каскады для таблиц позволяют выполнять операции с одной таблицей и автоматически обновлять, удалить или вставить соответствующие строки в других таблицах. Каскады бывают CascadeType.ALL, CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE, CascadeType.DETACH и CascadeType.REFRESH. CascadeType.ALL - выполняет все операции каскада: сохранение, обновление, удаление и объединение. CascadeType.PERSIST - выполняет операцию сохранения, что означает, что при сохранении новой сущности все связанные сущности также будут сохранены. CascadeType.MERGE - выполняет операцию объединения, что означает, что все связанные сущности будут объединены вместе с главной сущностью. CascadeType.REMOVE - выполняет операцию удаления, что означает, что при удалении сущности все связанные сущности также будут удалены. CascadeType.DETACH - выполняет операцию отсоединения, что означает, что при отсоединении главной сущности все связанные сущности также будут отсоединены. CascadeType.REFRESH - выполняет операцию обновления, что означает, что все связанные сущности будут обновлены вместе с главной сущностью. HTTP (Hypertext Transfer Protocol) - это протокол передачи данных в Интернете. Запрос HTTP состоит из метода, URL-адреса, заголовков и тела запроса. Ответ HTTP состоит из статуса ответа, заголовков и тела ответа. HTTP-методы - это GET, POST, PUT, DELETE, HEAD, OPTIONS и TRACE. Они определяют тип операции, выполняемой на ресурсе. GET: используется для получения ресурса с сервера. POST: используется для отправки данных на сервер для обработки. PUT: используется для обновления ресурса на сервере. DELETE: используется для удаления ресурса на сервере. HEAD: используется для получения заголовков ответа без получения тела ответа. OPTIONS: используется для получения информации о поддерживаемых методах и функциях сервера. TRACE: используется для получения копии запроса, отправленного на сервер, для отладки и диагностики. REST (Representational State Transfer) - это архитектурный стиль для разработки веб-сервисов. Он основан на использовании HTTP-протокола для передачи данных и определяет набор ограничений для упрощения коммуникации между клиентом и сервером. Преимущества REST-сервисов - простота и гибкость, легкая масштабируемость, универсальность, возможность использования в различных клиентских приложениях. Недостатки - сложность при работе с более сложными операциями, ограниченность в выборе форматов передачи данных. В REST-сервисах используются различные форматы данных для передачи информации между клиентом и сервером, такие как JSON (JavaScript Object Notation), XML (Extensible Markup Language) и YAML (YAML Ain't Markup Language). @ResponseBody и @RequestBody - это аннотации в Spring, которые используются для маршалинга данных в HTTP-запросах и ответах. @ResponseBody позволяет возвращать данные в теле ответа в виде объекта, а @RequestBody позволяет принимать данные в теле запроса в виде объекта. ResponseEntity - это класс в Spring, который используется для возврата ответа с заданными статусом, заголовками и телом ответа. @RestController и @Controller - это аннотации в Spring, которые используются для создания контроллеров веб-приложений. @RestController объединяет в себе функциональность аннотаций @Controller и @ResponseBody, что делает контроллер более простым и читаемым. RestTemplate - это класс в Spring, который предоставляет удобный способ для выполнения HTTP-запросов к удаленному веб-серверу из веб-приложения. Он предоставляет несколько методов для выполнения различных типов HTTP-запросов, таких как GET, POST, PUT и DELETE, и может использоваться для работы с REST-сервисами. RestTemplate в Spring также предоставляет возможность работать с данными в различных форматах, таких как JSON, XML и других. Он автоматически выполняет процесс маршалинга и демаршалинга данных, что упрощает разработку и улучшает читаемость кода. RestTemplate также поддерживает аутентификацию и использование HTTPS для безопасной передачи данных. Bootstrap - это библиотека CSS и JavaScript, которая содержит набор готовых компонентов и стилей для быстрой и простой разработки адаптивных веб-сайтов и приложений. Она позволяет создавать красивый и современный дизайн без необходимости писать много кода. AJAX (Asynchronous JavaScript and XML) и Fetch JS - это технологии, позволяющие отправлять и получать данные между клиентом и сервером без перезагрузки страницы. AJAX использует объект XMLHttpRequest (XHR) для отправки асинхронных HTTP-запросов на сервер и обновления части веб-страницы без перезагрузки. Он может быть использован для получения и отправки различных форматов данных, включая HTML, XML, JSON и другие. Fetch JS - это более новая технология, предоставляющая упрощенный интерфейс для отправки HTTP-запросов. Он также поддерживает асинхронность и работает с различными форматами данных. Использование AJAX и Fetch JS позволяет создавать более динамические и интерактивные веб-приложения, которые могут обмениваться данными с сервером без перезагрузки страницы. Однако, необходимо быть осторожным с использованием этих технологий, так как неправильная реализация может привести к проблемам безопасности и производительности Дополнительные вопросы : LazyInitializationException - это исключение, которое возникает при попытке доступа к отложенной (лениво загруженной) коллекции или свойству объекта в Hibernate или другой ORM-библиотеке. Отложенная загрузка позволяет загружать связанные сущности только по мере необходимости, что может улучшить производительность при работе с большими объемами данных. Однако, если попытаться получить доступ к лениво загруженной коллекции после закрытия сессии или транзакции, возникает исключение LazyInitializationException. Чтобы решить эту проблему, можно использовать специальные методы, такие как Hibernate.initialize() или entityManager.getReference(), чтобы явно инициализировать объекты и коллекции до закрытия сессии или транзакции. Также можно настроить Fetch-стратегию в маппинге сущностей, чтобы Hibernate автоматически загружал связанные объекты, когда они будут запрошены. Проблема n + 1 (n+1 problem) - это проблема, возникающая при использовании ORM-библиотеки при работе с коллекциями. Эта проблема возникает, когда при запросе списка объектов, ORM-библиотека выполняет n+1 SQL-запросов к базе данных, где n - количество объектов в списке. Например, если нужно получить список авторов книг и для каждого автора получить список его книг, то при использовании ORM-библиотеки может возникнуть проблема n+1, при которой для каждого автора будет выполнен отдельный SQL-запрос на получение списка его книг. Это может привести к значительному ухудшению производительности при работе с большими объемами данных. Решение этой проблемы может быть достигнуто, например, путем использования Fetch-стратегии в маппинге сущностей или использованием JPA-запросов с использованием JOIN FETCH. Каскады - это механизмы, используемые в ORM-библиотеках для автоматического распространения операций на связанные объекты. Каскады позволяют автоматически сохранять, обновлять или удалять связанные сущности, когда происходят соответствующие операции с основной сущностью. Примеры каскадов: CascadeType.ALL - автоматически распространяет все операции на связанные объекты CascadeType.PERSIST - автоматически сохраняет связанные Маршалинг (англ. marshalling) - процесс преобразования объекта в последовательность байтов, которую можно сохранить в файле или передать по сети для дальнейшего использования в программе или на другом компьютере. Процесс обратного преобразования последовательности байтов в объект называется демаршалингом (англ. unmarshalling). Маршалинг используется для передачи данных между программами на разных языках программирования или между программами, работающими на разных платформах. что такое хранимые процедуры ? для чего они нужны ? Хранимая процедура - это набор предопределенных SQL-операторов, которые сохранены в базе данных и могут быть вызваны при необходимости. Хранимые процедуры могут выполнять различные задачи, такие как чтение, обновление или удаление данных, а также проводить более сложные операции, такие как проверка целостности данных, анализ данных и принятие решений на основе этих данных. Одним из основных преимуществ использования хранимых процедур является уменьшение количества трафика между приложением и базой данных. При вызове хранимой процедуры, все операции выполняются на стороне базы данных, что позволяет сократить время ответа и увеличить производительность. Хранимые процедуры также могут быть использованы для повторного использования кода. Когда набор SQL-операторов сохранен в виде хранимой процедуры, он может быть вызван из различных приложений и сценариев без необходимости повторного написания кода. Кроме того, хранимые процедуры могут обеспечить более высокий уровень безопасности, поскольку они могут быть вызваны только с определенными правами доступа. Однако, следует учитывать, что создание и управление хранимыми процедурами требует дополнительных усилий и навыков, а также может сделать код менее легким для чтения и понимания. внутренние классы , типы Внутренние классы - это классы, которые определены внутри других классов. В Java внутренние классы делятся на четыре типа: Вложенные статические классы (static nested classes) - это внутренние классы, которые объявлены как статические. Они не имеют доступа к нестатическим членам внешнего класса, но могут быть созданы без создания экземпляра внешнего класса. Внутренние классы (inner classes) - это внутренние классы, которые не объявлены как статические. Они могут иметь доступ к нестатическим членам внешнего класса и могут быть созданы только через экземпляр внешнего класса. Локальные классы (local classes) - это классы, определенные внутри метода или блока кода. Они могут иметь доступ как к статическим, так и к нестатическим членам внешнего класса, если они объявлены как final. Анонимные классы (anonymous classes) - это классы, которые не имеют имени и определены как объекты других классов. Они могут иметь доступ как к статическим, так и к нестатическим членам внешнего класса, если они объявлены как final. Внутренние классы позволяют логически связывать классы, которые используются только внутри других классов, уменьшают количество кода и повышают безопасность, так как они могут скрыть реализацию от внешнего мира. Dependency injection (DI) - это паттерн проектирования, который используется для управления зависимостями в программном обеспечении. В DI объектам необходимые зависимости передаются из внешнего источника (обычно это контейнер DI) вместо того, чтобы объекты создавали их сами. При использовании DI, каждый компонент программного обеспечения имеет четко определенные зависимости. Вместо того, чтобы объект создавал свои зависимости, он получает их из контейнера DI. Это позволяет изменять поведение программы без изменения ее кода, достигая более гибкой архитектуры и более простого тестирования. DI может быть реализован с помощью различных методов, таких как конструкторы, сеттеры и методы инициализации объекта. Во многих современных языках программирования, таких как Java, C# и Python, существуют специальные библиотеки и фреймворки для управления зависимостями и создания контейнеров DI. DI также обеспечивает решение проблемы "жесткой связности" (tight coupling) между объектами, что повышает гибкость программного обеспечения и облегчает его поддержку и развитие. @Component и @ComponentScan - это две разные аннотации в Spring Framework, которые используются для разных целей. @Component - это базовая аннотация, которая используется для пометки класса как компонента, который может быть автоматически сканирован и создан контейнером Spring. Эта аннотация может быть использована для пометки классов, таких как DAO, сервисы, контроллеры, конвертеры и т.д. @ComponentScan - это аннотация, которая используется для указания пакета (или нескольких пакетов) для автоматического сканирования компонентов Spring. Эта аннотация указывает на корневой пакет, который будет сканироваться, и обычно используется в конфигурационных классах, которые определяют настройки контейнера Spring. Таким образом, аннотация @Component используется для пометки конкретных классов как компонентов Spring, а @ComponentScan используется для указания пакета, который должен быть автоматически сканирован для поиска компонентов Spring. Кроме того, @ComponentScan может быть использована с другими аннотациями, такими как @Configuration, @SpringBootApplication, @EnableAutoConfiguration и т.д., чтобы указать, какие пакеты должны быть сканированы для компонентов Spring. @Repository - что там с исключением ? @Repository - это аннотация в Spring Framework, которая используется для пометки класса как репозитория (хранилища данных), которое может быть автоматически сканировано и создано контейнером Spring. Кроме того, при использовании аннотации @Repository, она также может быть связана с исключением, которое называется DataAccessException. Это исключение - это обертка для исключений, связанных с доступом к данным, которые могут возникнуть в хранилище данных. DataAccessException обеспечивает общий способ обработки исключений, связанных с доступом к данным, для всех слоев приложения. Он предоставляет единый способ обработки исключений в коде слоя доступа к данным, позволяя обрабатывать их в едином месте и принимать соответствующие действия в зависимости от конкретной ситуации. В общем, использование аннотации @Repository с исключением DataAccessException обеспечивает более четкую обработку исключений при работе с хранилищами данных в Spring Framework. |