1. 개요
Spring Security는 Spring Data와의 통합을 위한 훌륭한 지원을 제공합니다. 전자는 애플리케이션의 Security 측면을 처리하는 반면 후자는 애플리케이션 데이터가 포함된 데이터베이스에 대한 편리한 액세스를 제공합니다.
이 기사에서는 Spring Security가 Spring Data와 통합되어 더 많은 사용자별 쿼리를 가능하게 하는 방법에 대해 설명합니다 .
2. 스프링 시큐리티 + 스프링 데이터 구성
Spring Data JPA 소개에서 Spring 프로젝트에서 Spring Data를 설정하는 방법을 살펴보았습니다. 평소와 같이 스프링 Security 및 스프링 데이터를 활성화하기 위해 Java 또는 XML 기반 구성을 채택할 수 있습니다.
2.1. 자바 구성
Spring Security 로그인 양식 (섹션 4 및 5)에서 어노테이션 기반 구성을 사용하여 프로젝트에 Spring Security를 추가할 수 있음을 상기하십시오.
@EnableWebSecurity
public class WebSecurityConfig {
// Bean definitions
}
기타 구성 세부 정보에는 필요에 따라 필터, 빈 및 기타 Security 규칙의 정의가 포함됩니다.
Spring Security에서 Spring Data를 활성화하려면 WebSecurityConfig 에 이 bean을 추가하기만 하면 됩니다 .
@Bean
public SecurityEvaluationContextExtension securityEvaluationContextExtension() {
return new SecurityEvaluationContextExtension();
}
위의 정의는 클래스에 어노테이션이 달린 스프링 데이터 특정 표현식의 자동 해결 활성화를 가능하게 합니다.
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 또는 네임스페이스 기반 구성의 경우 SecurityEvaluationContextExtension 빈을 XML 구성 파일에 추가합니다.
<bean class="org.springframework.security.data.repository
.query.SecurityEvaluationContextExtension"/>
SecurityEvaluationContextExtension 을 정의하면 Spring Data 쿼리 내에서 사용 가능한 Spring Security의 모든 공통 표현식이 만들어집니다.
이러한 일반적인 표현에는 principal, authentication, isAnonymous(), hasRole([role]), isAuthenticated 등 이 포함됩니다.
3. 사용 예
Spring Data 및 Spring Security의 몇 가지 사용 사례를 살펴보겠습니다.
3.1. AppUser 필드 업데이트 제한
이 예에서는 App User 의 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. 페이지 매김 으로 특정 AppUser의 콘텐츠 가져오기
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 Data에 Spring Security를 추가하는 방법에 대해 알아보았습니다. Spring Data 또는 Spring Security의 다른 강력한 기능에 대한 자세한 내용은 Spring Data 및 Spring Security 기사 모음에서 찾을 수 있습니다.
늘 그렇듯이 코드 스니펫은 GitHub 에서 찾을 수 있습니다 .