Skip to content

Commit 65170e0

Browse files
authored
Merge pull request #427 from Kernel360/develop
[merge] develop into main
2 parents 575c10b + 5f79be6 commit 65170e0

File tree

27 files changed

+866
-39
lines changed

27 files changed

+866
-39
lines changed

core/src/main/java/com/kernelsquare/core/common_response/error/code/AuthErrorCode.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@ public enum AuthErrorCode implements ErrorCode {
1414
ALREADY_SAVED_NICKNAME(HttpStatus.CONFLICT, AuthServiceStatus.ALREADY_SAVED_NICKNAME, "사용 중인 닉네임입니다."),
1515
ALREADY_SAVED_EMAIL(HttpStatus.CONFLICT, AuthServiceStatus.ALREADY_SAVED_EMAIL, "사용 중인 이메일입니다."),
1616
UNAUTHORIZED_ACCESS(HttpStatus.NOT_FOUND, AuthServiceStatus.UNAUTHORIZED_ACCESS, "접근 권한이 없습니다."),
17-
UNAUTHENTICATED(HttpStatus.UNAUTHORIZED, AuthServiceStatus.UNAUTHENTICATED, "해당 기능은 로그인이 필요합니다.");
17+
UNAUTHENTICATED(HttpStatus.UNAUTHORIZED, AuthServiceStatus.UNAUTHENTICATED, "해당 기능은 로그인이 필요합니다."),
18+
NO_EMAIL_INFO(HttpStatus.BAD_REQUEST, AuthServiceStatus.NO_EMAIL_INFO, "이메일 정보가 없습니다."),
19+
SOCIAL_TYPE_MISMATCH(HttpStatus.BAD_REQUEST, AuthServiceStatus.SOCIAL_TYPE_MISMATCH, "등록되지 않은 소셜타입 입니다.");
1820

1921
private final HttpStatus httpStatus;
2022
private final ServiceStatus serviceStatus;

core/src/main/java/com/kernelsquare/core/common_response/service/code/AuthServiceStatus.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ public enum AuthServiceStatus implements ServiceStatus {
1111
ALREADY_SAVED_EMAIL(1103),
1212
UNAUTHORIZED_ACCESS(1104),
1313
UNAUTHENTICATED(1105),
14+
NO_EMAIL_INFO(1106),
15+
SOCIAL_TYPE_MISMATCH(1107),
1416

1517
//success
1618
LOGIN_SUCCESS(1140),

core/src/main/java/com/kernelsquare/core/type/SocialProvider.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
public enum SocialProvider {
99
KAKAO("kakao"),
1010
GITHUB("github"),
11+
NAVER("naver"),
1112
GOOGLE("google");
1213

1314
private final String description;
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,15 @@
11
package com.kernelsquare.domainmysql.domain.member_authority.repository;
22

3+
import com.kernelsquare.domainmysql.domain.member.entity.Member;
34
import org.springframework.data.jpa.repository.JpaRepository;
45

56
import com.kernelsquare.domainmysql.domain.member_authority.entity.MemberAuthority;
67

8+
import java.util.List;
9+
710
public interface MemberAuthorityRepository extends JpaRepository<MemberAuthority, Long> {
11+
12+
List<MemberAuthority> findAllByMember(Member member);
13+
814
void deleteAllByMemberId(Long memberId);
915
}

domain-mysql/src/main/java/com/kernelsquare/domainmysql/domain/social_login/entity/SocialLogin.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import jakarta.persistence.Id;
1313
import jakarta.persistence.Table;
1414
import lombok.AccessLevel;
15+
import lombok.Builder;
1516
import lombok.Getter;
1617
import lombok.NoArgsConstructor;
1718

@@ -30,4 +31,12 @@ public class SocialLogin extends BaseEntity {
3031
@Enumerated(value = EnumType.STRING)
3132
@Column(nullable = false, name = "social_provider", columnDefinition = "varchar(40)")
3233
private SocialProvider socialProvider;
34+
35+
36+
@Builder
37+
public SocialLogin(Long id, String email, SocialProvider socialProvider) {
38+
this.id = id;
39+
this.email = email;
40+
this.socialProvider = socialProvider;
41+
}
3342
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package com.kernelsquare.domainmysql.domain.social_login.repository;
2+
3+
import com.kernelsquare.core.type.SocialProvider;
4+
import com.kernelsquare.domainmysql.domain.social_login.entity.SocialLogin;
5+
import org.springframework.data.jpa.repository.JpaRepository;
6+
7+
public interface SocialLoginRepository extends JpaRepository<SocialLogin, Long> {
8+
9+
Boolean existsByEmailAndSocialProvider(String email, SocialProvider socialProvider);
10+
}

member-api/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ dependencies {
4444

4545
//Security
4646
implementation 'org.springframework.boot:spring-boot-starter-security'
47+
implementation 'org.springframework.boot:spring-boot-starter-oauth2-client'
4748

4849
implementation group: 'io.jsonwebtoken', name: 'jjwt-api', version: '0.11.5'
4950

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.kernelsquare.memberapi.common.config;
2+
3+
import lombok.RequiredArgsConstructor;
4+
import org.springframework.context.annotation.Bean;
5+
import org.springframework.context.annotation.Configuration;
6+
import org.springframework.security.oauth2.client.userinfo.DefaultOAuth2UserService;
7+
import org.springframework.security.oauth2.client.userinfo.OAuth2UserService;
8+
9+
@Configuration
10+
@RequiredArgsConstructor
11+
public class OAuth2Config {
12+
13+
@Bean
14+
public OAuth2UserService oAuth2UserService() {
15+
return new DefaultOAuth2UserService();
16+
}
17+
18+
}

member-api/src/main/java/com/kernelsquare/memberapi/common/config/SecurityConfig.java

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
package com.kernelsquare.memberapi.common.config;
22

3+
import com.kernelsquare.memberapi.common.oauth2.handler.OAuth2LoginFailureHandler;
4+
import com.kernelsquare.memberapi.common.oauth2.handler.OAuth2LoginSuccessHandler;
5+
import com.kernelsquare.memberapi.common.oauth2.service.CustomOAuth2MemberService;
6+
import com.kernelsquare.memberapi.domain.auth.service.TokenProvider;
37
import org.springframework.context.annotation.Bean;
48
import org.springframework.context.annotation.Configuration;
59
import org.springframework.http.HttpMethod;
@@ -16,7 +20,6 @@
1620
import com.kernelsquare.memberapi.common.filter.JWTSettingFilter;
1721
import com.kernelsquare.memberapi.common.jwt.JWTAccessDeniedHandler;
1822
import com.kernelsquare.memberapi.common.jwt.JWTAuthenticationEntryPoint;
19-
import com.kernelsquare.memberapi.domain.auth.service.TokenProvider;
2023

2124
import lombok.RequiredArgsConstructor;
2225

@@ -25,9 +28,12 @@
2528
@EnableMethodSecurity
2629
@RequiredArgsConstructor
2730
public class SecurityConfig {
28-
private final TokenProvider tokenProvider;
2931
private final JWTAuthenticationEntryPoint jwtAuthenticationEntryPoint;
3032
private final JWTAccessDeniedHandler jwtAccessDeniedHandler;
33+
private final OAuth2LoginSuccessHandler oAuth2LoginSuccessHandler;
34+
private final OAuth2LoginFailureHandler oAuth2LoginFailureHandler;
35+
private final CustomOAuth2MemberService customOAuth2MemberService;
36+
private final TokenProvider tokenProvider;
3137

3238
private final String[] permitAllPatterns = new String[] {
3339
"/api/v1/auth/check/email",
@@ -73,6 +79,7 @@ public class SecurityConfig {
7379
"/api/v1/levels/**"
7480
};
7581

82+
7683
@Bean
7784
public PasswordEncoder passwordEncoder() {
7885
return new BCryptPasswordEncoder();
@@ -95,6 +102,13 @@ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
95102
.requestMatchers(HttpMethod.GET, "/api/v1/coffeechat/posts/{postId}").permitAll()
96103
.requestMatchers(HttpMethod.GET, "/api/v1/hashtags").permitAll()
97104
.requestMatchers(HttpMethod.GET, "/api/v1/techs").permitAll()
105+
106+
.requestMatchers(HttpMethod.GET, "/login/oauth2/**").permitAll()
107+
.requestMatchers(HttpMethod.GET, "/oauth2/**").permitAll()
108+
.requestMatchers(HttpMethod.GET, "/favicon.ico/**").permitAll()
109+
// 백엔드 임시 테스트 창
110+
.requestMatchers(HttpMethod.GET, "/api/v1/test").permitAll()
111+
98112
.requestMatchers(HttpMethod.GET, "/api/v1/coding-meetings").permitAll()
99113
.requestMatchers(HttpMethod.GET, "/api/v1/coding-meetings/{codingMeetingToken}").permitAll()
100114
.requestMatchers(HttpMethod.GET, "/api/v1/coding-meeting-comments/{codingMeetingToken}").permitAll()
@@ -147,12 +161,13 @@ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
147161
sessionManagementConfigurer
148162
.sessionCreationPolicy(SessionCreationPolicy.STATELESS));
149163

150-
// http.oauth2Login(oAuth2LoginConfigurer ->
151-
// oAuth2LoginConfigurer
152-
// .successHandler(oAuth2LoginSuccessHandler)
153-
// .failureHandler(oAuth2LoginFailureHandler)
154-
// .userInfoEndpoint(userInfoEndpointConfigurer ->
155-
// userInfoEndpointConfigurer.userService(customOAuth2MemberService)))
164+
http.oauth2Login(oAuth2LoginConfigurer ->
165+
oAuth2LoginConfigurer
166+
.successHandler(oAuth2LoginSuccessHandler)
167+
.failureHandler(oAuth2LoginFailureHandler)
168+
.userInfoEndpoint(userInfoEndpointConfigurer ->
169+
userInfoEndpointConfigurer.userService(customOAuth2MemberService)));
170+
156171
http.logout(Customizer.withDefaults());
157172

158173
return http.build();

member-api/src/main/java/com/kernelsquare/memberapi/common/filter/JWTSettingFilter.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,20 @@
11
package com.kernelsquare.memberapi.common.filter;
22

33
import java.io.IOException;
4+
import java.security.Key;
45

6+
import com.kernelsquare.core.common_response.error.exception.BusinessException;
7+
import io.jsonwebtoken.ExpiredJwtException;
8+
import io.jsonwebtoken.Jwts;
9+
import io.jsonwebtoken.MalformedJwtException;
10+
import io.jsonwebtoken.UnsupportedJwtException;
11+
import io.jsonwebtoken.io.Decoders;
12+
import io.jsonwebtoken.security.Keys;
13+
import org.springframework.beans.factory.InitializingBean;
14+
import org.springframework.beans.factory.annotation.Value;
515
import org.springframework.security.core.Authentication;
616
import org.springframework.security.core.context.SecurityContextHolder;
17+
import org.springframework.stereotype.Component;
718
import org.springframework.util.StringUtils;
819
import org.springframework.web.filter.OncePerRequestFilter;
920

@@ -17,6 +28,9 @@
1728
import jakarta.servlet.http.HttpServletResponse;
1829
import lombok.RequiredArgsConstructor;
1930

31+
import static com.kernelsquare.core.common_response.error.code.TokenErrorCode.*;
32+
import static com.kernelsquare.core.common_response.error.code.TokenErrorCode.WRONG_TOKEN;
33+
2034
@RequiredArgsConstructor
2135
public class JWTSettingFilter extends OncePerRequestFilter {
2236
private final TokenProvider tokenProvider;

0 commit comments

Comments
 (0)