Spring boot reactive web에 구글 로그인을 붙이는 건 너무 간단하다.
https://devkimchi.tistory.com/76
글의 후반부에 보면 클라이언트 아이디 비번만 추가해 줌으로써 로그인 창을 띄우고 간단한 사용자 정보까지 리턴 받을 수 있었다. 위의 초기 세팅까지 하면 was가 가동 후 root 페이지에서 부터 권한이 있어야 한다며 로그인 창을 띄우는데
spring security 설정으로 특정 페이지 에만 권한 요청을 할 수 있도록 설정이 가능하다.
특정 페이지는 로그인, 그리고 특정 권한이 있는 사용만 가능하게 설정 하고 나머지는 권한 체크가 없는 설정이다.
권한 필요한 영역 시큐리티 설정
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.method.configuration.EnableReactiveMethodSecurity;
import org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity;
import org.springframework.security.config.web.server.ServerHttpSecurity;
import org.springframework.security.web.server.SecurityWebFilterChain;
import static org.springframework.security.authorization.AuthorityReactiveAuthorizationManager.hasRole;
@Configuration
@EnableWebFluxSecurity
@EnableReactiveMethodSecurity
@RequiredArgsConstructor
public class SecurityConfig {
@Bean
SecurityWebFilterChain springWebFilterChain(ServerHttpSecurity http) {
http.authorizeExchange((authorize) -> authorize
.pathMatchers("/manage/**").authenticated()
.pathMatchers("/admin/**").hasRole("ADMIN")
.pathMatchers("/db/**").access((authentication, context) ->
hasRole("ADMIN").check(authentication, context)
.filter(decision -> !decision.isGranted())
.switchIfEmpty(hasRole("DBA").check(authentication, context))
)
.anyExchange().permitAll()
)
.httpBasic().disable()
.csrf().disable()
.formLogin().disable()
.oauth2Login()
;
return http.build();
}
}
- 클래스를 생성한다
- @Configuration
@EnableWebFluxSecurity 어노테이션을 설정한다.
어노테이션 설정으로 보안 설정파일을 활성화시켜줄 수 있다. - 필터체인을 빈으로 등록시켜주는 것만으로도 체인에 추가된다.
- .pathMatchers("/manage/**").authenticated()
패스매처를 사용하여 특정 패턴의 요청이 있을 시 권한을 체크할 수 있다.
권한이 없을 시 구글 로그인 창이 다시 나온다. - .httpBasic().disable()
.csrf().disable()
.formLogin().disable()
기존의 구현된 로그인 기능들은 disabled 시켜 주고 - .oauth2Login()
은 활성화 시켜 준다.
/manage/admin 이런 요청이 있을 시 로그인창이 뜨고 /나 다른 url의 경우 모두 다 사용 가능하다.
이 설정 만으로도 로그인 유무를 알 수 있다. 계정계를 다 구현해 준다면 시간이 엄청 걸리는데 구글의 자원을 이용하여 권한과 보안 관련된 어렵고 까다로운 보안 부분을 편하게 사용할 수 있다.
기본적으로 구현된 EndPoint
http://localhost/logout
http://localhost/oauth2/authorization/google
기본적으로 구현된 url이다. 스프링과 구글 api 구현해 둔 구현체인데 매우 고맙지만 사이트의 디자인에 맞게 커스터 마이징 할 필요는 있어 보인다. 애플리 케이션 구동 때는 아스키 문자 집어넣는 것만으로도 쉽게 바꿀 수 있게 되어 있는데 저런 부분도 좀더 이쁘고 심플하게 바꿀수 있는 걸 제공해 주면 보다 이로울 것이다.
OAuth2User 기본 정보 객체
@RequestMapping("/")
public Mono<String> homeResponse(@AuthenticationPrincipal Mono<OAuth2User> user) {
기본적으로 구글에서 로그인 후 가장 기초 적인 정보는 @AuthenticationPrincipal 어노테이션과 OAuth2User 객체를 통해 사용 가능하다.
IDE에 디버깅을 걸고 객체에 머가 들어있는지 간단히 살펴보면 아래와 같다.
Intellij에서는 원하는 지점에 f8을 눌러 브레이크를 걸고 객체의 내용을 살펴보면 이름, 이메일, 사진 등 구글 로그인 시 기초 적인 내용과 인증된 이메일인지 여부를 알 수 있고 gcp api 설정에서 좀 더 항목들을 추가하면 추가 정보를 얻을 수 있을 것이라 기대한다.
구글 인증은 처음인데 추가로 권한 설정과 추가 정보는 rdb에 저장해도 되지만 어디에 저장하든 추가로 불러와야 되지 않을까 싶다.
추후에 gcp에서 데이터를 가져오거나 파이어 베이스에서 스토어 데이터베이스를 가져오거나 둘 중 하나를 선택해서 진행해 볼 예정입니다.
파이어 베이스 쪽에도 인증 id를 맞춰놨기에 가능하리라고 본다.
스프링 구글 로그인 편의성
수많은 시행착오 끝에 소기의 목적은 이루었지만. 정확히 모든 것을 알고 진행한 것이 아니기에 시행착오가 많았다.
스프링은 수많은 자동 설정들이 있고 이를 커스터 마이징 할 수 있는데 어디에 머가 있는지도 잘 모르고 잘못 설정하면 작동을 안 하는 경우도 있고 해서 스프링도 알면 쉽고 모르면 어렵다는 점.
그래서 알면 쉽게 설정해서 빨리 로직을 만들어 테스트를 해볼 수 있다는 점이 장점이 된다.
여기까지 스프링 부트 웹플럭스 혹은 리액티브 웹 초간단 시큐리티 설정과 thymeleaf를 이용한 화면 설정이었고 다음 편엔 이제 파이어 스토어 데이터 베이스에 접속해서 저장 및 읽기 가능한 코드를 구현하고 간단한 CRUD를 만들어 보겠습니다.
'개발 > 스프링 FIreBase Neo4j' 카테고리의 다른 글
미디어 쿼리 적용 반응형 웹 사이트 만들기 와이드 모니터용 (0) | 2023.02.05 |
---|---|
피그마 웹 소스 출력은 없나? 플러그인이 있을거 같은데?! 사용법 (0) | 2023.02.05 |
스프링 부트 메테리얼 디자인 적용 라이브러리는 없나? 피그마? (0) | 2023.02.04 |
스프링 부트 머티리얼디자인 적용 시키기 (0) | 2023.02.02 |
Spring Boot Material Design 3 선택 이유 Thymeleaf Layout 적용 (0) | 2023.02.02 |