이전 블로그 포스팅에서 눈치 채셨겠지만, 저는 다음을 좋아합니다. Spring + Java 그리고 Spring + Kotlin. 따라서 OAuth 2.0 인증을 구현해야 할 때마다 스프링-security-oauth2 라이브러리는 자연스럽게 선택됩니다.

그러나 Spring Security와 OAuth2를 함께 사용하는 방법을 보여주는 방법은 거의 없습니다. 스프링 보안 인증 2 를 inMemory 및 JDBC 이외의 다른 데이터 소스와 함께 사용할 수 있습니다. 많은 것을 구성해야 하므로 이 튜토리얼은 사용자 인증 방법의 세 부분으로 나누어 설명하겠습니다, 토큰 저장소를 구성하는 방법 동적 클라이언트를 구성하는 방법에 대해 설명합니다. 그럼 시작해 보겠습니다!

먼저, 최신 버전 중 하나를 사용하고 있다고 가정합니다. 스프링 보안 인증 2:

둘째, 저는 스프링 데이터와 함께 카우치베이스를 사용하고 있습니다. 다른 데이터 소스를 사용 중이더라도 이 블로그 시리즈에서 많은 코드를 재사용할 수 있습니다.

또한 다음과 같은 기능을 추가했습니다. 롬복 를 종속성으로 사용하여 Java의 상용구를 줄입니다:

다음과 관련된 Spring 보안 문서에 따라 리소스 서버를 구성해 보겠습니다. 스프링 보안 인증 2: "리소스 서버(권한 서버와 동일하거나 별도의 애플리케이션일 수 있음)는 OAuth2 토큰으로 보호되는 리소스를 제공합니다. Spring OAuth는 이 보호를 구현하는 Spring 보안 인증 필터를 제공합니다. 이를 켜려면 @EnableResourceServer 에 @Configuration 클래스를 생성하고, 필요에 따라 리소스 서버 컨피규레이터를 사용하여 구성합니다."

 

이제 다음과 같은 인터페이스를 구현해 보겠습니다. UserDetailsService. 이 인터페이스는 데이터 소스와 Spring Security OAuth 사이의 다리 역할을 담당합니다:

위 코드에서는 다음과 같은 유형의 클래스를 반환하고 있습니다. 사용자 세부 정보도 Spring에서 가져온 것입니다. 다음은 그 구현입니다:

User 클래스가 UserDetails를 직접 구현하도록 할 수도 있었습니다. 하지만 제 사용 사례에는 사용자가 속한 그룹 목록도 필요하기 때문에 위에 구현을 추가했습니다.

사용자, 보안 그룹 및 각 리포지토리의 모습은 다음과 같습니다:

그리고 기본 엔티티 클래스는 스프링 데이터와 카우치베이스에서 더 잘 작동하기 위한 작은 해킹이기도 합니다:

 

마지막으로 SecurityConfig 클래스의 구현은 다음과 같습니다:

 

Spring-Boot 2.0에서는 더 이상 AuthenticationManager 빈을 직접 주입할 수 없지만 Spring Security 프레임워크에서는 여전히 필요합니다. 따라서 이 객체에 대한 액세스 권한을 얻으려면 작은 해킹을 구현해야 합니다:

이 수업을 잘게 나누어 무슨 일이 일어나고 있는지 이해해 보겠습니다:

사용자의 비밀번호는 일반 텍스트로 되어 있으므로 새 NoOpPasswordEncoder 인스턴스를 반환하면 됩니다. 일반적인 표준은 BCryptPasswordEncoder 클래스의 인스턴스를 반환하는 것입니다.

지금은 인메모리 토큰 저장소를 사용하겠지만, 2부에서는 카우치베이스를 토큰 저장소로 사용하는 방법도 살펴보겠습니다.

여기서 OAuth2와 Spring Boot의 마법이 일어납니다. 구체적으로, 우리는 Spring에 우리의 사용자 세부 정보 서비스 를 사용하여 사용자를 검색할 수 있습니다. 이 코드 블록은 지금까지 수행한 작업의 핵심 부분입니다.

이 블록을 사용하면 CORS(교차 출처 리소스 공유)를 사용하여 요청할 수 있습니다.

마지막으로 JQuery를 통해 API를 호출해야 하는 경우 위의 코드도 추가해야 합니다. 그렇지 않으면 "사전 비행에 대한 응답에 HTTP 확인 상태가 없습니다.." 오류입니다.

이제 남은 것은 인증 서버를 추가하는 것뿐입니다:

이제 앱을 시작하고 Postman 또는 Jquery를 통해 호출할 수 있습니다:

 

성능 향상

Couchbase를 사용하는 경우 사용자 이름을 문서의 키로 사용하는 것이 좋습니다. 이렇게 하면 키-값 저장소 를 사용하여 N1QL 쿼리를 실행하는 대신 로그인 성능을 크게 향상시킬 수 있습니다.

 

Couchbase, OAuth 보안 또는 Spring 및 OAuth2 인증 최적화에 대해 궁금한 점이 있으면 다음 주소로 트윗해 주세요. @deniswsrosa

작성자

게시자 데니스 로사, 개발자 옹호자, 카우치베이스

데니스 로사는 독일 뮌헨에 거주하고 있는 카우치베이스의 개발자 옹호자입니다. 그는 소프트웨어 엔지니어로서 탄탄한 경력을 쌓았으며 Java, Python, Scala, Javascript를 유창하게 구사합니다. Denis는 검색, 빅 데이터, AI, 마이크로서비스 및 개발자가 아름답고 빠르고 안정적이며 확장 가능한 앱을 만드는 데 도움이 되는 모든 것에 대해 글을 쓰는 것을 좋아합니다.

댓글 하나

  1. 아주 좋은 글입니다. 이 게시물의 코드를 공유해 주시겠어요?

댓글 남기기