1. Обзор
Spring Security обеспечивает хорошую поддержку интеграции с Spring Data. В то время как первый обрабатывает аспекты безопасности нашего приложения, последний обеспечивает удобный доступ к базе данных, содержащей данные приложения.
В этой статье мы обсудим, как Spring Security можно интегрировать с Spring Data, чтобы включить больше пользовательских запросов .
2. Spring Security + Spring Конфигурация данных
В нашем введении в Spring Data JPA мы увидели, как настроить Spring Data в проекте Spring. Как обычно, чтобы включить безопасность Spring и данные Spring, мы можем использовать конфигурацию на основе Java или XML.
2.1. Конфигурация Java
Напомним, что из формы входа в Spring Security (разделы 4 и 5) мы можем добавить Spring Security в наш проект, используя конфигурацию на основе аннотаций:
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
// Bean definitions
}
Другие детали конфигурации будут включать определение фильтров, bean-компонентов и других правил безопасности по мере необходимости.
Чтобы включить Spring Data в Spring Security, мы просто добавляем этот bean-компонент в WebSecurityConfig
:
@Bean
public SecurityEvaluationContextExtension securityEvaluationContextExtension() {
return new SecurityEvaluationContextExtension();
}
Приведенное выше определение позволяет активировать автоматическое разрешение выражений, специфичных для данных Spring, аннотированных в классах.
2.2. XML-конфигурация
Конфигурация на основе XML начинается с включения пространства имен Spring Security:
<beans:beans xmlns="http://www.springframework.org/schema/security"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security.xsd">
...
</beans:beans>
Как и в конфигурации на основе Java, для конфигурации на основе XML или пространства имен мы добавим bean-компонент SecurityEvaluationContextExtension в файл конфигурации XML:
<bean class="org.springframework.security.data.repository
.query.SecurityEvaluationContextExtension"/>
Определение SecurityEvaluationContextExtension
делает все распространенные выражения в Spring Security доступными из запросов Spring Data.
Такие распространенные выражения включают принципала, аутентификацию, isAnonymous(), hasRole([role]), isAuthenticated и
т. д.
3. Пример использования
Давайте рассмотрим некоторые варианты использования Spring Data и Spring Security.
3.1. Ограничить обновление поля AppUser
В этом примере мы рассмотрим ограничение обновления поля lastLogin
пользователя
приложения
только для пользователя , прошедшего проверку подлинности в данный момент.
Под этим мы подразумеваем, что каждый раз, когда запускается метод updateLastLogin , он обновляет только поле
lastLogin
текущего аутентифицированного пользователя.
Для этого мы добавляем следующий запрос в наш интерфейс UserRepository
:
@Query("UPDATE AppUser u SET u.lastLogin=:lastLogin WHERE"
+" u.username = ?#{ principal?.username }")
void updateLastLogin (Date lastLogin);
Без интеграции Spring Data и Spring Security нам обычно приходилось бы передавать имя пользователя в качестве аргумента для updateLastLogin
.
В случае предоставления неправильных учетных данных пользователя процесс входа завершится ошибкой, и нам не нужно беспокоиться о проверке доступа.
3.2. Получить контент конкретного пользователя приложения с разбиением на
страницы
Другой сценарий, в котором Spring Data и Spring Security отлично работают рука об руку, — это случай, когда нам нужно получить контент из нашей базы данных, который принадлежит текущему аутентифицированному пользователю.
Например, если у нас есть приложение для создания твитов, мы можем захотеть отображать твиты, созданные или понравившиеся текущему пользователю, на его персонализированной странице каналов.
Конечно, это может включать в себя написание запросов для взаимодействия с одной или несколькими таблицами в нашей базе данных. С Spring Data и Spring Security это так же просто, как написать:
public interface TweetRepository extends PagingAndSortingRepository<Tweet, Long> {
@Query("SELECT twt FROM Tweet twt JOIN twt.likes AS lk WHERE lk = ?#{ principal?.username }" +
" OR twt.owner = ?#{ principal?.username }")
Page<Tweet> getMyTweetsAndTheOnesILiked(Pageable pageable);
}
Поскольку мы хотим, чтобы наши результаты были разбиты на страницы, наш TweetRepository
расширяет PagingAndSortingRepository
в приведенном выше определении интерфейса.
4. Вывод
Интеграция Spring Data и Spring Security обеспечивает большую гибкость в управлении аутентифицированными состояниями в приложениях Spring.
В этом сеансе мы рассмотрели, как добавить Spring Security в Spring Data. Подробнее о других мощных функциях Spring Data или Spring Security можно узнать в нашей коллекции статей Spring Data и Spring Security .
Как обычно, фрагменты кода можно найти на GitHub .