Инструкция по созданию бизнесобъектов. Strategy это поведенческий паттерн, выносит набор алгоритмов в собственные классы и делает их взаимозаменимыми
Скачать 0.73 Mb.
|
23. Rollback при Runtime исключении?Spring автоматически откатывает транзакции для unchecked (Runtime) исключений. Например, если один транзакционный метод вызывает другой транзакционный метод в другом классе и этот внутренний вызов выбрасывает Runtime exception, то вся транзакция целиком будет отменена. В этом случае можно использовать параметр noRollBackFor или выполнить внутреннюю транзакцию в новой транзакции (свойства propagation). Аннотация @Transactional будет проигнорирована и не выбросит исключения если применять ее к private, protected или default модификаторами доступа. 24. Как отследить внешнюю транзакцию?С помощью TransactionSynchronizationManager.isActualTransactionActive() можно отслеживать какую-либо внешнюю транзакцию, если она есть. 25. Что произойдет, если один метод с @Transactional вызовет другой метод с @Transactional?Если это происходит в рамках одного сервиса, то второй транзакционный метод будет считаться частью первого, так как вызван у него изнутри, а так как спринг не знает о внутреннем вызове, то не создаст прокси для второго метода. 26. Что произойдет, если один метод БЕЗ @Transactional вызовет другой метод с @Transactional?Так как Spring не знает о внутреннем вызове, то не создаст прокси для второго метода. 27. Будет ли транзакция отменена, если будет брошено исключение, которое указано в контракте метода?Если в контракте описано это исключение, то она не откатится. Unchecked-исключения в транзакционном методе можно ловить, а можно и не ловить. 28. Почему правильно аннотировать @Transactional методы, а не класс? Почему нужно делать это в Service-слое, а не в DAO\Repository?Так как реализация бизнес-операции находится в сервисе, а не в репозитории, то именно метод сервиса мы и аннотируем с помощью @Transactional. Аннотация над классом – это поведение транзакций, которое будет применено в методах этого класса и его наследников по умолчанию. Когда метод аннотируется с @Transactional, он будет иметь приоритет над транзакционными настройками, определенными на уровне класса. В режиме прокси (который по умолчанию) перехватываются только вызовы внешних методов, поступающие через прокси. Это означает, что самоисключение, по сути, метод в целевом объекте, вызывающий другой метод целевого объекта, не приведет к фактической транзакции во время выполнения, даже если вызываемый метод отмечен @Transactional. Кроме того, прокси-сервер должен быть полностью инициализирован для обеспечения ожидаемого поведения, поэтому не следует полагаться на эту функцию в коде инициализации, то есть на @PostConstruct. хттп структура идемпотентность хттп методов Коды состояния HTTP (достаточно знать группы)? Что такое http-заголовок? Что такое http-сессия? 29. Spring security?Spring Security – это Java/Java EE фреймворк (модуль Spring), предоставляющий механизмы построения систем аутентификации и авторизации, а также другие возможности обеспечения безопасности для промышленных приложений, созданных с помощью Spring Framework. Также под Spring Security можно понимать список фильтров в виде класса FilterChainProxy, интегрированного в контейнер сервлетов, и в котором есть поле List Каждый фильтр реализует какой-то механизм безопасности. Важна последовательность фильтров в цепочке. Когда есть аннотация @EnableWebSecurity добавляется DelegatingFilterProxy, его задача заключается в том, чтобы вызвать цепочку фильтров (FilterChainProxy) из Spring Security. В Java-based конфигурации цепочка фильтров создается неявно. Если мы хотим настроить свою цепочку фильтров, мы можем сделать это, создав класс, конфигурирующий наше Spring Security приложение, и имплементировав интерфейс WebSecurityConfigurerAdapter. В данном классе, мы можем переопределить метод: @Override protected void configure(HttpSecurity http) throws Exception { http .csrf().disable() .authorizeRequests(); } Именно этот метод конфигурирует цепочку фильтров Spring Security и логика, указанная в этом методе, настроит цепочку фильтров. Основнаяструктура Spring Security: 1. SecurityContextHolder – обеспечивает доступ к SecurityContext. Это место, в котором хранится информация о текущем контексте безопасности приложения, который включает в себя подробную информацию о пользователе, работающем с приложением. По умолчанию SecurityContextHolder использует MODE_THREADLOCAL для хранения такой информации. Это означает, что контекст безопасности всегда доступен для методов, исполняющихся в том же самом потоке, даже если контекст безопасности явно не передается в качестве аргумента этих методов, например, SecurityContextHolder.getContext().getAuthentication().getPrincipal(); Но есть и два других «модификатора»: 1. MODE_GLOBAL – все потоки Java-машины используют один контекст безопасности; 2. MODE_INHERITABLETHREADLOCAL – потоки, порожденные от одного защищенного потока, наличие аналогичной безопасности. 2. SecurityContext – интерфейс, который содержит объект Authentication и в случае необходимости информацию системы безопасности, связанную с запросом. По умолчанию на каждый поток создается один SecurityContext. SecurityContext-ы хранятся в SecurityContextHolder. Имеет два метода: getAuthentication() и setAuthentication(Authentication authentication). 3. Authentication – представляет принципала с точки зрения Spring Security; 4. GrantedAuthority – отражает разрешения, выданные доверителю в масштабе всего приложения. Например, роли или уровни доступа пользователя. 5. UserDetails – это интерфейс, который предоставляет необходимую информацию для построения объекта Authentication из DAO-объектов приложения или других источника данных системы безопасности. User Details выступает в качестве Principal. Т.е, по сути, модель имплементирующая данный интерфейс будет хранить пользовательскую информацию в виде логина, пароля и флагов isAccountNonExpired, isAccountNonLocked, isCredentialsNonExpired, isEnabled, а также коллекции прав (ролей) пользователя, которая после будет инкапсулирована в объекты Authentication. 6. UserDetailsService – интерфейс, который создает UserDetails, если передано имя пользователя в виде String (или идентификатор сертификата или что-то подобное). Он представляет собой принципала, но в расширенном виде и с учетом специфики приложения. 7. Credentials – это некоторая информация для аутентификации пользователя. Под ней можно понимать пароль, отпечаток пальца или сетчатки глаза, голосовое распознавание и т.д. Процесс аутентификации: 1. UsernamePasswordAuthenticationFilter получают имя пользователя и пароль и создает экземпляр класса UsernamePasswordAuthenticationToken (экземпляр интерфейса Authentication); 2. Токен передается экземпляру AuthenticationManager для проверки; 3. AuthenticationManager возвращает полностью заполненный экземпляр Authentication в случае успешной аутентификации; 4. Устанавливается контекст безопасности через вызов SecurityContextHolder.getContext().setAuthentication(...), куда передается вернувшийся экземпляр Authentication. 5. При успешной аутентификации можно использовать successHandler. 8. Principal – это интерфейс, отражающий учетную запись пользователя. В терминах логин-пароль это логин. В интерфейсе Authentication есть метод getPrincipal(), возвращающий Object. При аутентификации с использованием имени пользователя/пароля Principal реализуется объектом типа UserDetails. Возможности SpringSecurity: 1. Шифрование паролей – Spring Security не ограничивается аутентификацией. Фреймворк также помогает решить проблему с безопасным хранением паролей. Spring Security предлагает назначить объекту UserDetails собственный шифровальщик паролей. По умолчанию используется BCrypt. Также можно настроить количество раундов хеширования и реализацию случайного алгоритма; 2. Интеграция с Servlet API; 3. Интеграция с Spring Web MVC при необходимости; 4. Защита от атак типа фиксация сессии, кликджекинг, межсайтовая подделка запроса и др. Сross-site request forgery (CSRF, межсайтовая подделка запроса) – это вид атак на посетителей веб-сайтов, использующий недостатки протокола HTTP. Если жертва заходит на сайт, созданный злоумышленником, от ее лица тайно отправляется запрос на другой сервер (например, на сервер платежной системы), осуществляющий некую вредоносную операцию (например, перевод денег на счет злоумышленника). Для осуществления данной атаки жертва должна быть аутентифицирована на том сервере, на который отправляется запрос, и этот запрос не должен требовать какого-либо подтверждения со стороны пользователя, которое не может быть проигнорировано или подделано атакующим скриптом. Clickjacking – это механизм обмана пользователей интернета, при котором злоумышленник может получить доступ к конфиденциальной информации или даже получить доступ к компьютеру пользователя, заманив его на внешне безобидную страницу или внедрив вредоносный код на безопасную страницу. Принцип основан на том, что поверх видимой страницы располагается невидимый слой, в который и загружается нужная злоумышленнику страница, при этом элемент управления (кнопка, ссылка), необходимый для осуществления требуемого действия, совмещается с видимой ссылкой или кнопкой, нажатие на которую ожидается от пользователя. Возможны различные применения технологии — от подписки на ресурс в социальной сети до кражи конфиденциальной информации и совершения покупок в интернет-магазинах за чужой счет. |