Skip to content

Commit 396a206

Browse files
authored
Merge pull request #37 from CommitField/dev
Dev
2 parents 1c0d3d6 + 9951563 commit 396a206

File tree

9 files changed

+128
-22
lines changed

9 files changed

+128
-22
lines changed

src/main/java/cmf/commitField/domain/chat/chatMessage/entity/ChatMessage.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,14 @@
88
import jakarta.persistence.JoinColumn;
99
import jakarta.persistence.ManyToOne;
1010
import lombok.AllArgsConstructor;
11-
import lombok.Builder;
1211
import lombok.Getter;
1312
import lombok.NoArgsConstructor;
13+
import lombok.experimental.SuperBuilder;
1414

1515
import java.time.LocalDateTime;
1616

1717
@Entity
18-
@Builder
18+
@SuperBuilder
1919
@Getter
2020
@NoArgsConstructor
2121
@AllArgsConstructor

src/main/java/cmf/commitField/domain/chat/chatRoom/entity/ChatRoom.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,15 @@
66
import cmf.commitField.global.jpa.BaseEntity;
77
import jakarta.persistence.*;
88
import lombok.AllArgsConstructor;
9-
import lombok.Builder;
109
import lombok.Getter;
1110
import lombok.NoArgsConstructor;
11+
import lombok.experimental.SuperBuilder;
1212

1313
import java.time.LocalDateTime;
1414
import java.util.List;
1515

1616
@Entity
17-
@Builder
17+
@SuperBuilder
1818
@Getter
1919
@NoArgsConstructor
2020
@AllArgsConstructor

src/main/java/cmf/commitField/domain/chat/userChatRoom/entity/UserChatRoom.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,13 @@
88
import jakarta.persistence.JoinColumn;
99
import jakarta.persistence.ManyToOne;
1010
import lombok.AllArgsConstructor;
11-
import lombok.Builder;
1211
import lombok.Getter;
1312
import lombok.NoArgsConstructor;
13+
import lombok.experimental.SuperBuilder;
1414

1515
@Entity
1616
@Getter
17-
@Builder
17+
@SuperBuilder
1818
@NoArgsConstructor
1919
@AllArgsConstructor
2020
public class UserChatRoom extends BaseEntity {
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,9 @@
11
package cmf.commitField.domain.main.main.controller;
22

33
import org.springframework.stereotype.Controller;
4-
import org.springframework.web.bind.annotation.GetMapping;
54
import org.springframework.web.bind.annotation.RequestMapping;
6-
import org.springframework.web.bind.annotation.ResponseBody;
75

86
@Controller
97
@RequestMapping
108
public class ApiV1MainController {
11-
@GetMapping
12-
@ResponseBody
13-
public String getMain() {
14-
return "Hello! cmf main!";
15-
}
169
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package cmf.commitField.domain.user.entity;
2+
3+
import org.springframework.security.core.GrantedAuthority;
4+
import org.springframework.security.core.authority.SimpleGrantedAuthority;
5+
import org.springframework.security.oauth2.core.user.OAuth2User;
6+
7+
import java.util.Collection;
8+
import java.util.List;
9+
import java.util.Map;
10+
11+
public class CustomOAuth2User implements OAuth2User {
12+
13+
private final OAuth2User oauth2User;
14+
private final User user;
15+
16+
public CustomOAuth2User(OAuth2User oauth2User, User user) {
17+
this.oauth2User = oauth2User;
18+
this.user = user;
19+
}
20+
21+
@Override
22+
public Map<String, Object> getAttributes() {
23+
return oauth2User.getAttributes();
24+
}
25+
26+
@Override
27+
public Collection<? extends GrantedAuthority> getAuthorities() {
28+
return List.of(new SimpleGrantedAuthority("ROLE_" + user.getRole().name()));
29+
}
30+
31+
@Override
32+
public String getName() {
33+
return user.getUsername();
34+
}
35+
36+
}

src/main/java/cmf/commitField/domain/user/entity/User.java

+16-8
Original file line numberDiff line numberDiff line change
@@ -4,26 +4,34 @@
44
import cmf.commitField.domain.chat.chatRoom.entity.ChatRoom;
55
import cmf.commitField.domain.chat.userChatRoom.entity.UserChatRoom;
66
import cmf.commitField.global.jpa.BaseEntity;
7-
import jakarta.persistence.Entity;
8-
import jakarta.persistence.FetchType;
9-
import jakarta.persistence.OneToMany;
7+
import jakarta.persistence.*;
108
import lombok.AllArgsConstructor;
11-
import lombok.Builder;
129
import lombok.Getter;
1310
import lombok.NoArgsConstructor;
11+
import lombok.Setter;
12+
import lombok.experimental.SuperBuilder;
1413

1514
import java.util.List;
1615

1716
@Entity
1817
@Getter
19-
@Builder
18+
@Setter
19+
@SuperBuilder
2020
@NoArgsConstructor
2121
@AllArgsConstructor
2222
public class User extends BaseEntity {
23-
private String email;
24-
private String nickname;
25-
private String password;
23+
private String username; // GitHub 로그인 ID
24+
private String email; // 이메일
25+
private String nickname; // 닉네임
26+
private String avatarUrl; //아바타
2627

28+
@Enumerated(EnumType.STRING) // DB에 저장될 때 String 형태로 저장됨
29+
private Role role;
30+
31+
public enum Role {
32+
USER, ADMIN
33+
}
34+
//추가
2735
@OneToMany(mappedBy = "user", fetch = FetchType.LAZY)
2836
private List<ChatRoom> chatRooms;
2937

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package cmf.commitField.domain.user.repository;
2+
3+
import cmf.commitField.domain.user.entity.User;
4+
import org.springframework.data.jpa.repository.JpaRepository;
5+
6+
import java.util.Optional;
7+
8+
public interface UserRepository extends JpaRepository<User, Long> {
9+
Optional<User> findByUsername(String username);
10+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package cmf.commitField.domain.user.service;
2+
3+
import cmf.commitField.domain.user.entity.CustomOAuth2User;
4+
import cmf.commitField.domain.user.entity.User;
5+
import cmf.commitField.domain.user.repository.UserRepository;
6+
import org.springframework.security.oauth2.client.userinfo.DefaultOAuth2UserService;
7+
import org.springframework.security.oauth2.client.userinfo.OAuth2UserRequest;
8+
import org.springframework.security.oauth2.core.user.OAuth2User;
9+
import org.springframework.stereotype.Service;
10+
11+
import java.util.Map;
12+
import java.util.Optional;
13+
14+
@Service
15+
public class CustomOAuth2UserService extends DefaultOAuth2UserService {
16+
private final UserRepository userRepository;
17+
18+
public CustomOAuth2UserService(UserRepository userRepository) {
19+
this.userRepository = userRepository;
20+
}
21+
22+
@Override
23+
public OAuth2User loadUser(OAuth2UserRequest userRequest) {
24+
OAuth2User oauthUser = super.loadUser(userRequest);
25+
26+
Map<String, Object> attributes = oauthUser.getAttributes();
27+
String username = (String) attributes.get("login"); // GitHub ID
28+
String email = (String) attributes.get("email");
29+
String name = (String) attributes.get("name");
30+
String avatarUrl = (String) attributes.get("avatar_url");
31+
32+
// 이메일이 없는 경우를 대비하여 기본값 설정
33+
if (email == null) {
34+
email = username + "@github.com";
35+
}
36+
37+
Optional<User> existingUser = userRepository.findByUsername(username);
38+
User user;
39+
if (existingUser.isPresent()) {
40+
user = existingUser.get();
41+
user.setAvatarUrl(avatarUrl);
42+
user.setEmail(email); // GitHub에서 이메일이 변경될 수도 있으니 업데이트\
43+
} else {
44+
user = new User(username, email, name, avatarUrl, User.Role.USER, null, null, null);
45+
userRepository.save(user);
46+
}
47+
48+
return new CustomOAuth2User(oauthUser, user);
49+
}
50+
}

src/main/java/cmf/commitField/global/security/SecurityConfig.java

+10-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package cmf.commitField.global.security;
22

3+
import cmf.commitField.domain.user.entity.CustomOAuth2User;
4+
import cmf.commitField.domain.user.service.CustomOAuth2UserService;
35
import org.springframework.context.annotation.Bean;
46
import org.springframework.context.annotation.Configuration;
57
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
@@ -13,9 +15,14 @@
1315
@Configuration
1416
@EnableWebSecurity
1517
public class SecurityConfig {
18+
private final CustomOAuth2UserService customOAuth2UserService;
19+
20+
public SecurityConfig(CustomOAuth2UserService customOAuth2UserService) {
21+
this.customOAuth2UserService = customOAuth2UserService;
22+
}
23+
1624
@Bean
1725
protected SecurityFilterChain config(HttpSecurity http) throws Exception {
18-
1926
//로그인 관련 설정
2027
http
2128
.oauth2Login(oauth2 -> oauth2
@@ -24,6 +31,8 @@ protected SecurityFilterChain config(HttpSecurity http) throws Exception {
2431
// 인증 정보가 SecurityContext에 추가되는 것을 보장
2532
SecurityContextHolder.getContext().setAuthentication(authentication);
2633

34+
CustomOAuth2User customUser = (CustomOAuth2User) authentication.getPrincipal();
35+
2736
// 디버깅: authentication 정보 확인
2837
System.out.println("Authentication: " + authentication);
2938
System.out.println("Principal: " + authentication.getPrincipal());

0 commit comments

Comments
 (0)