1. https://console.developers.google.com/
여기 접속해서 새 프로젝트를 만들어 준다.
사용자 인증 정보에서 이름과 리디렉션 URI를 입력해준다.
URI의 login부터 google까지는 고정.
만들면 클라이언트 ID와 비밀번호를 준다.
2. 스프링부트 OAuth2 Client를 pom.xml에 추가해준다.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-oauth2-client</artifactId>
</dependency>
3. application.yml 수정
security:
oauth2:
client:
registration:
google: # /oauth2/authorization/google 이 주소를 동작하게 한다.
client-id: 클라이언트 ID 넣기
client-secret: 클라이언트 보안 비밀번호 넣기
scope:
- email
- profile
4. loginForm에 구글 로그인 버튼 추가
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>로그인 페이지</title>
</head>
<body>
<h1>로그인 페이지</h1>
<hr>
<form action="/login" method="POST">
<input type="text" name="username" placeholder="Username"> <br>
<input type="password" name="password" placeholder="Password"> <br>
<button>로그인</button>
</form>
<a href="/oauth2/authorization/google">구글 로그인</a>
<a href="/joinForm">회원가입을 아직 하지 않으셨나요?</a>
</body>
</html>
5. SecurityConfig 수정.
package com.pure.security.config;
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.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import com.pure.security.config.oauth.PrincipalOauth2UserService;
@Configuration
@EnableWebSecurity //스프링 시큐리티 필터 등록
@EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true) //secured 어노테이션, preAuthorize 어노테이션 활성화
public class SecurityConfig extends WebSecurityConfigurerAdapter{
@Autowired
private PrincipalOauth2UserService principalOauth2UserService;
@Bean
public BCryptPasswordEncoder encodePwd() {
return new BCryptPasswordEncoder();
};
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable();
http.authorizeRequests()
.antMatchers("/user/**").authenticated()
.antMatchers("/manager/**").access("hasRole('ROLE_ADMIN') or hasRole('ROLE_MANAGER')")
.antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')")
.anyRequest().permitAll() //위의 세 주소 이외의 나머지는 로그인 없이 접근 가능
.and()
.formLogin()
.loginPage("/loginForm") // "/login"주소가 올 때는 로그인 페이지 보여주기
.loginProcessingUrl("/login") //login 주소가 호출되면 시큐리티가 대신 로그인 진행
.defaultSuccessUrl("/") //loginForm에서 로그인을 하면 인덱스로 가지만 특정페이지에서 로그인으로 넘어온 경우에는 로그인 후 이전페이지를 다시 보여줌.
.and()
.oauth2Login()
.loginPage("/loginForm")
.userInfoEndpoint()
.userService(principalOauth2UserService); //구글 로그인 완료 후 액세스토큰, 사용자프로필 받기 / OAuth2UserRequest 객체에 정보가 담김
}
}
.and() 밑으로 새로 추가함.
config.oauth 패키지를 만들고 그 안에 PrincipalOauth2UserService 객체를 만든다.
이 객체 안에 OAuth2UserRequest가 들어가는데 그 안에 각종 유저 정보들이 들어온다.
5. PrincipalOauth2UserService 작성
package com.pure.security.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 {
@Override
public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2AuthenticationException {
System.out.println("userRequset.getClientRegistration: "+ userRequest.getClientRegistration());
System.out.println("userRequset.getAccessToken: "+ userRequest.getAccessToken());
System.out.println("userRequest.getAttributes: "+ super.loadUser(userRequest).getAttributes());
return super.loadUser(userRequest);
}
}
sysout은 안의 메서드들이 뭘 들고 있는지 보기 위해 찍어봄.
실질적으로 가져다 쓸 정보는 userRequest.getAttributes 안에 들어있다.
6. User 오브젝트 수정
여러 공급자를 통해 로그인을 시도할 예정이기 때문에 구분을 위해 컬럼을 추가해준다.
package com.pure.security.model;
import java.sql.Timestamp;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import org.hibernate.annotations.CreationTimestamp;
import lombok.Data;
@Data
@Entity
public class User {
@Id // primary key
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String username;
private String password;
private String email;
private String role;
private String provider;
private String providerId;
@CreationTimestamp
private Timestamp createDate;
}
다음 글에선 이 정보를 이용하여 우리 서버에 회원가입을 진행시킬 예정.
'취업 준비 > Spring security' 카테고리의 다른 글
8. 페이스북 Oauth 로그인 (0) | 2022.02.22 |
---|---|
7. PrincipalDetails 객체를 이용하여 2가지 로그인 방식 통합 (0) | 2022.02.17 |
5. 시큐리티 권한처리 (0) | 2022.02.16 |
4. 로그인 만들기 (0) | 2022.02.16 |
3. 회원가입 만들기 (0) | 2022.02.10 |