Oauth2.0 구글 회원 프로필 정보 받아보기
User Entity
package com.example.security1.model;
import jakarta.persistence.*;
import lombok.Data;
import org.hibernate.annotations.CreationTimestamp;
import java.sql.Timestamp;
@Entity
@Data
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column
private String username;
@Column
private String password;
@Column
private String email;
@Column
private String role;
@Column
private String provider;
@Column
private String providerId;
@CreationTimestamp
private Timestamp createDate;
}
어느 사이트에서 정보를 받아와 회원가입을 했는지 판단하기 위해
provider와 providerId가 추가되었다.
PrincipalOauth2UserService
package com.example.security1.config.oauth;
import org.springframework.security.oauth2.client.userinfo.DefaultOAuth2UserService;
import org.springframework.security.oauth2.client.userinfo.OAuth2UserRequest;
import org.springframework.security.oauth2.core.OAuth2AuthenticationException;
import org.springframework.security.oauth2.core.user.OAuth2User;
import org.springframework.stereotype.Service;
@Service
public class PrincipalOauth2UserService extends DefaultOAuth2UserService {
//구글로 부터 userRequest 데이터에 대한 후처리 되는 함수
@Override
public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2AuthenticationException {
System.out.println("getClientRegistration : " + userRequest.getClientRegistration());
System.out.println("getAccessToken : " + userRequest.getAccessToken().getTokenValue());
System.out.println("getAttributes : " + super.loadUser(userRequest).getAttributes());
return super.loadUser(userRequest);
}
}
Oauth 로그인으로부터 받은 데이터를 후처리 하기 위하여 만든 클래스이다.
구글로부터 인증코드만 받는 것이 아닌
바로 accessToken과 프로필 정보까지 받아오는 처리가 한 번에 진행된다.
콘솔창에 나오는 정보를 확인하기 위해 print를 해주었다.
SecuriyConfig
package com.example.security1.config;
import com.example.security1.config.oauth.PrincipalOauth2UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;
@Configuration
@EnableWebSecurity // 스프링 시큐리티 필터(SecurityConfig)가 스프링 필터체인에 등록이 된다.
@EnableMethodSecurity(securedEnabled = true, prePostEnabled = true) //secured 어노테이션 활성화, preAuthorize, postAuthorize 어노테이션 활성화
public class SecurityConfig {
@Autowired
private PrincipalOauth2UserService principalOauth2UserService;
@Bean //해당 메서드의 리턴되는 오브젝트를 IoC로 등록해 준다.
public BCryptPasswordEncoder encodePwd() {
return new BCryptPasswordEncoder();
}
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http.csrf().disable();
http.authorizeHttpRequests()
.requestMatchers("/user/**").authenticated() //인증만 되면 들어갈 수 있는 주소
.requestMatchers("/manager/**").hasAnyRole("ADMIN", "MANAGER")
.requestMatchers("/admin/**").hasAnyRole("ADMIN")
.anyRequest().permitAll()
.and()
.formLogin()
.loginPage("/loginForm")
//.usernameParameter("username2") -> html의 login받는 form에서 username을 username2로 바꾸면 PrincipalDetailsService의 username과 매칭이 되지 않는다.
//그럴때 usernameParameter() 를 이용하여 바꾸어 주면 된다.
.loginProcessingUrl("/login")
/*
loginProcessingUrl() :
"/login"이라는 주소가 호출이 되면 시큐리티가 낚아채서 대신 로그인을 진행해준다.
=> "/login"을 만들지 않아도 된다. security가 대신 해주기 때문에
*/
.defaultSuccessUrl("/") //로그인이 완료되면 default인 메인페이지로 가게된다. 또한 특정페이지에서 로그인을 하면 그 특정페이지로 이동한다.
.and()
.oauth2Login()
.loginPage("/loginFrom")
/*
구글 로그인이 완료된 뒤의 후처리가 필요함.
1. 코드받기(인증)
2. 엑세스토큰(권한)
3. 사용자프로필 정보를 가져옴
4. 그 정보를 토대로 회원가입을 자동으로 진행시키기도함
5. 정보가 부족한 경우 ex) 쇼핑몰(이메일, 전화번호, 이름, 아이디) -> (집주소), 백화점몰 -> (vip등급, 일반등급)
6. 추가적인 정보가 필요한 경우가 아니라면 4번이 가능하다.
*/
.userInfoEndpoint()
.userService(principalOauth2UserService);
return http.build();
}
}
userInfoEndpoint()
OAuth2.0 인증 서버에서 사용자 정보를 가져오는 엔드포인트를 구성하는 메서드이다.
인증 서버에서 사용자 정보를 가져와서 애플리케이션 내부에서 활용할 수 있게 된다.
userService()
() 안의 객체를 사용하여 사용자 정보를 처리하는 메서드이다.
위의 과정으로부터
accessToken이 콘솔창에서 확인이 가능하고
attributes에서 로그인한 사용자의 정보를 파악할 수 있다.
이를 활용하여 회원가입을 시키는데 필요한 정보를 가공하여
회원가입을 시키면 된다.
'자바 탐구' 카테고리의 다른 글
스프링) SpringSecurity - 9) Oauth2.0 구글 로그인 및 자동 회원 가입 진행 완료 (0) | 2023.05.26 |
---|---|
스프링) SpringSecurity - 8) Oauth2.0 Authentication객체가 가질 수 있는 2가지 타입 (0) | 2023.05.26 |
스프링) SpringSecurity - 6) Oauth2.0 구글 로그인 준비 (0) | 2023.05.26 |
스프링) SpringSecurity - 5) Security 권한 처리 (0) | 2023.05.26 |
스프링) SpringSecurity - 4) Security 로그인 (0) | 2023.05.26 |