Перейти к основному содержимому

Spring Данные с Spring Security

· 4 мин. чтения

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 .