From 413b3d788b475bbb4baed00a4c6abdd574277c22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EC=A7=80=EB=AF=BC?= Date: Thu, 12 Dec 2024 00:20:34 +0900 Subject: [PATCH] =?UTF-8?q?Initial:=20=ED=9A=8C=EC=9B=90=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20=EC=B4=88=EA=B8=B0=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Spring Security 의존성 추가 - JWT 관련 의존성 추가 (jjwt-api, jjwt-impl, jjwt-jackson) - SecurityConfig 클래스 구성 - User 엔티티 정의 - Controller, Service, Repository 계층 구조 설정 Resolves: #11 --- refrigerator/build.gradle | 6 +++ .../refrigerator/aggregate/user/User.java | 22 +++++++++ .../refrigerator/config/SecurityConfig.java | 48 +++++++++++++++++++ .../controller/user/AdminController.java | 12 +++++ .../controller/user/UserController.java | 19 ++++++++ .../repository/user/UserRepository.java | 9 ++++ .../service/user/UserService.java | 4 ++ .../service/user/UserServiceImpl.java | 16 +++++++ 8 files changed, 136 insertions(+) create mode 100644 refrigerator/src/main/java/moja/refrigerator/config/SecurityConfig.java create mode 100644 refrigerator/src/main/java/moja/refrigerator/controller/user/AdminController.java create mode 100644 refrigerator/src/main/java/moja/refrigerator/controller/user/UserController.java create mode 100644 refrigerator/src/main/java/moja/refrigerator/repository/user/UserRepository.java create mode 100644 refrigerator/src/main/java/moja/refrigerator/service/user/UserService.java create mode 100644 refrigerator/src/main/java/moja/refrigerator/service/user/UserServiceImpl.java diff --git a/refrigerator/build.gradle b/refrigerator/build.gradle index d1f5710..0e3a358 100644 --- a/refrigerator/build.gradle +++ b/refrigerator/build.gradle @@ -35,6 +35,12 @@ dependencies { testRuntimeOnly 'org.junit.platform:junit-platform-launcher' implementation 'org.modelmapper:modelmapper:3.1.0' + + implementation 'org.springframework.boot:spring-boot-starter-security' + implementation 'io.jsonwebtoken:jjwt-api:0.12.3' + implementation 'io.jsonwebtoken:jjwt-impl:0.12.3' + implementation 'io.jsonwebtoken:jjwt-jackson:0.12.3' + testImplementation 'org.springframework.boot:spring-boot-starter-test' } tasks.named('test') { diff --git a/refrigerator/src/main/java/moja/refrigerator/aggregate/user/User.java b/refrigerator/src/main/java/moja/refrigerator/aggregate/user/User.java index a352fc0..4fcd923 100644 --- a/refrigerator/src/main/java/moja/refrigerator/aggregate/user/User.java +++ b/refrigerator/src/main/java/moja/refrigerator/aggregate/user/User.java @@ -2,6 +2,9 @@ import jakarta.persistence.*; import lombok.Data; +import org.hibernate.annotations.CreationTimestamp; + +import java.time.LocalDate; @Entity @Table(name = "tbl_user") @@ -11,4 +14,23 @@ public class User { @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "user_pk") private long userPk; + + @Column(name = "user_id", nullable = false, unique = true) + private String userId; + + @Column(name = "user_pw", nullable = false) + private String userPw; + + @Column(name = "user_email", nullable = false, unique = true) + private String userEmail; + + @Column(name = "user_nickname", nullable = false, unique = true) + private String userNickname; + + @Column(name = "join_date", nullable = false, updatable = false) + @CreationTimestamp + private LocalDate joinDate; + +// @Column(name = "leave_date") +// private LocalDate leaveDate; } diff --git a/refrigerator/src/main/java/moja/refrigerator/config/SecurityConfig.java b/refrigerator/src/main/java/moja/refrigerator/config/SecurityConfig.java new file mode 100644 index 0000000..17e66a6 --- /dev/null +++ b/refrigerator/src/main/java/moja/refrigerator/config/SecurityConfig.java @@ -0,0 +1,48 @@ +package moja.refrigerator.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.http.SessionCreationPolicy; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.web.SecurityFilterChain; + +@Configuration +@EnableWebSecurity +public class SecurityConfig { + @Bean + // 비밀번호 암호화를 위한 인코더 + public BCryptPasswordEncoder bCryptPasswordEncoder() { + return new BCryptPasswordEncoder(); + } + + @Bean + public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { + // csrf 보안 비활성화 + http + .csrf((auth) -> auth.disable()); + + // 기본 로그인 폼 비활성화 + http + .formLogin((auth) -> auth.disable()); + + // HTTP Basic 인증 비활성화 + http + .httpBasic((auth) -> auth.disable()); + + // URL 별 접근 권한 설정 + http + .authorizeHttpRequests((auth) -> auth + .requestMatchers("/login", "/", "/join").permitAll() // 이 경로들은 모두 접근 가능 + .requestMatchers("/admin").hasRole("ADMIN") // admin 경로는 ADMIN 역할을 가진 사용자만 + .anyRequest().authenticated()); // 나머지는 인증된 사용자만 + + // 세션 관리 설정 + http + .sessionManagement((session) -> session + .sessionCreationPolicy(SessionCreationPolicy.STATELESS)); // JWT 사용을 위한 세션리스 설정 + + return http.build(); + } +} \ No newline at end of file diff --git a/refrigerator/src/main/java/moja/refrigerator/controller/user/AdminController.java b/refrigerator/src/main/java/moja/refrigerator/controller/user/AdminController.java new file mode 100644 index 0000000..f88b295 --- /dev/null +++ b/refrigerator/src/main/java/moja/refrigerator/controller/user/AdminController.java @@ -0,0 +1,12 @@ +package moja.refrigerator.controller.user; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class AdminController { + @GetMapping("/admin") + public String getAdminPage() { + return "admin Controller"; + } +} diff --git a/refrigerator/src/main/java/moja/refrigerator/controller/user/UserController.java b/refrigerator/src/main/java/moja/refrigerator/controller/user/UserController.java new file mode 100644 index 0000000..bfb9c12 --- /dev/null +++ b/refrigerator/src/main/java/moja/refrigerator/controller/user/UserController.java @@ -0,0 +1,19 @@ +package moja.refrigerator.controller.user; + +import moja.refrigerator.service.user.UserService; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class UserController { + private final UserService userService; + + public UserController(UserService userService) { + this.userService = userService; + } + +// @GetMapping("/") +// public String getMainPage() { +// return "user Controller"; +// } +} diff --git a/refrigerator/src/main/java/moja/refrigerator/repository/user/UserRepository.java b/refrigerator/src/main/java/moja/refrigerator/repository/user/UserRepository.java new file mode 100644 index 0000000..38fa297 --- /dev/null +++ b/refrigerator/src/main/java/moja/refrigerator/repository/user/UserRepository.java @@ -0,0 +1,9 @@ +package moja.refrigerator.repository.user; + +import moja.refrigerator.aggregate.user.User; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface UserRepository extends JpaRepository { +} diff --git a/refrigerator/src/main/java/moja/refrigerator/service/user/UserService.java b/refrigerator/src/main/java/moja/refrigerator/service/user/UserService.java new file mode 100644 index 0000000..3ebab0e --- /dev/null +++ b/refrigerator/src/main/java/moja/refrigerator/service/user/UserService.java @@ -0,0 +1,4 @@ +package moja.refrigerator.service.user; + +public interface UserService { +} diff --git a/refrigerator/src/main/java/moja/refrigerator/service/user/UserServiceImpl.java b/refrigerator/src/main/java/moja/refrigerator/service/user/UserServiceImpl.java new file mode 100644 index 0000000..4413f85 --- /dev/null +++ b/refrigerator/src/main/java/moja/refrigerator/service/user/UserServiceImpl.java @@ -0,0 +1,16 @@ +package moja.refrigerator.service.user; + +import moja.refrigerator.repository.user.UserRepository; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.stereotype.Service; + +@Service +public class UserServiceImpl implements UserService { + private final UserRepository userRepository; + private final BCryptPasswordEncoder passwordEncoder; + + public UserServiceImpl(UserRepository userRepository, BCryptPasswordEncoder passwordEncoder) { + this.userRepository = userRepository; + this.passwordEncoder = passwordEncoder; + } +}