Spring Data с помощью Spring Security

Spring Data с помощью Spring Security

1. обзор

Spring Security обеспечивает хорошую поддержку для интеграции с Spring Data. В то время как первая занимается аспектами безопасности нашего приложения, вторая обеспечивает удобный доступ к базе данных, содержащей данные приложения.

В этой статье мы обсудим, какSpring Security can be integrated with Spring Data to enable more user-specific queries.

2. Безопасность Spring + Конфигурация данных Spring

В нашемintroduction to Spring Data JPA мы увидели, как настроить Spring Data в проекте Spring. Для обеспечения безопасности Spring и данных Spring, как обычно, мы можем использовать конфигурацию на основе Java или XML.

2.1. Конфигурация Java

Напомним, что изSpring Security Login Form (разделы 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:


...

Как и в конфигурации на основе Java, для конфигурации на основе XML или пространства имен мы добавляем bean-компонентSecurityEvaluationContextExtension в файл конфигурации XML:

ОпределениеSecurityEvaluationContextExtension делает все распространенные выражения в Spring Security доступными из запросов Spring Data.

К таким общим выражениям относятсяprincipal, authentication, isAnonymous(), hasRole([role]), isAuthenticated, и т. Д.

3. Пример использования

Давайте рассмотрим некоторые варианты использования Spring Data и Spring Security.

3.1. Ограничить обновление поляAppUser

В этом примере мы рассмотрим ограничение обновления поляAppUser'slastLogin единственным пользователем, прошедшим проверку подлинности.

Под этим мы подразумеваем, что каждый раз, когда запускается методupdateLastLogin, он обновляет только полеlastLogin текущего аутентифицированного пользователя.

Для этого мы добавляем запрос ниже в наш интерфейсUserRepository:

@Query("UPDATE AppUser u SET u.lastLogin=:lastLogin WHERE"
  +" u.username = ?#{ principal?.username }")
public void updateLastLogin (Date lastLogin);

Без интеграции Spring Data и Spring Security нам обычно приходилось бы передавать имя пользователя в качестве аргументаupdateLastLogin.

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

3.2. Получение определенного содержимогоAppUser' с разбивкой на страницы

Еще один сценарий, в котором Spring Data и Spring Security работают идеально рука об руку, - это случай, когда нам нужно извлечь контент из нашей базы данных, которая принадлежит аутентифицированному в настоящее время пользователю.

Например, если у нас есть приложение твитера, мы можем захотеть отобразить твиты, созданные или понравившиеся текущему пользователю, на их странице персонализированных каналов.

Конечно, это может включать в себя написание запросов для взаимодействия с одной или несколькими таблицами в нашей базе данных. С Spring Data и Spring Security это так же просто, как написать:

public interface TweetRepository extends PagingAndSortingRepository {
    @Query("select twt from Tweet twt  JOIN twt.likes as lk where lk ="+
      " ?#{ principal?.username } or twt.owner = ?#{ principal?.username }")
    Page getMyTweetsAndTheOnesILiked(Pageable pageable);
}

Поскольку мы хотим, чтобы наши результаты были разбиты на страницы, нашTweetRepository расширяетPagingAndSortingRepository в приведенном выше определении интерфейса.

4. Заключение

Интеграция Spring Data и Spring Security обеспечивает большую гибкость управления аутентифицированными состояниями в приложениях Spring.

На этом занятии мы рассмотрели, как добавить Spring Security в Spring Data. Подробнее о других мощных функциях Spring Data или Spring Security можно найти в нашей коллекции статейSpring Data иSpring Security.

Как обычно, фрагменты кода можно найтиover on GitHub.

Related