diff --git a/pom.xml b/pom.xml index ea29406..c44141b 100644 --- a/pom.xml +++ b/pom.xml @@ -77,20 +77,30 @@ org.springframework.boot spring-boot-starter-web - - - + + org.springframework.boot + spring-boot-devtools + runtime + - - com.auth0 - java-jwt - 4.2.1 - + + io.jsonwebtoken + jjwt-api + 0.11.5 + + + io.jsonwebtoken + jjwt-impl + 0.11.5 + runtime + + + io.jsonwebtoken + jjwt-jackson + 0.11.5 + runtime + @@ -111,6 +121,12 @@ spring-boot-starter-test test + + org.projectlombok + lombok + true + + diff --git a/src/main/java/com/example/backend/BackendApplication.java b/src/main/java/com/example/backend/BackendApplication.java new file mode 100644 index 0000000..47f72be --- /dev/null +++ b/src/main/java/com/example/backend/BackendApplication.java @@ -0,0 +1,11 @@ +package com.example.backend; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class BackendApplication { + public static void main(String[] args) { + SpringApplication.run(BackendApplication.class, args); + } +} \ No newline at end of file diff --git a/src/main/java/com/example/backend/config/JwtTokenProvider.java b/src/main/java/com/example/backend/config/JwtTokenProvider.java new file mode 100644 index 0000000..3534a2f --- /dev/null +++ b/src/main/java/com/example/backend/config/JwtTokenProvider.java @@ -0,0 +1,24 @@ +package com.example.backend.config; + +import io.jsonwebtoken.*; +import org.springframework.stereotype.Component; +import java.util.*; + +@Component +public class JwtTokenProvider { + private final String SECRET_KEY = "secret-key"; + + public String createToken(String username, Long userId) { + return Jwts.builder() + .setSubject(username) + .claim("userId", userId) + .setIssuedAt(new Date()) + .setExpiration(new Date(System.currentTimeMillis() + 86400000)) + .signWith(SignatureAlgorithm.HS256, SECRET_KEY) + .compact(); + } + + public Long getUserIdFromToken(String token) { + return Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token).getBody().get("userId", Long.class); + } +} \ No newline at end of file diff --git a/src/main/java/com/example/backend/config/SecurityConfig.java b/src/main/java/com/example/backend/config/SecurityConfig.java new file mode 100644 index 0000000..eed67b1 --- /dev/null +++ b/src/main/java/com/example/backend/config/SecurityConfig.java @@ -0,0 +1,5 @@ +package com.example.backend.config; + +public class SecurityConfig { + +} diff --git a/src/main/java/com/example/backend/controller/AuthController.java b/src/main/java/com/example/backend/controller/AuthController.java new file mode 100644 index 0000000..d633f65 --- /dev/null +++ b/src/main/java/com/example/backend/controller/AuthController.java @@ -0,0 +1,19 @@ +package com.example.backend.controller; + +import com.example.backend.dto.LoginRequest; +import com.example.backend.service.AuthService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/auth") +public class AuthController { + + @Autowired + private AuthService authService; + + @PostMapping("/login") + public String login(@RequestBody LoginRequest request) { + return authService.login(request.getUsername(), request.getPassword()); + } +} \ No newline at end of file diff --git a/src/main/java/com/example/backend/controller/ImageController.java b/src/main/java/com/example/backend/controller/ImageController.java new file mode 100644 index 0000000..58f4b77 --- /dev/null +++ b/src/main/java/com/example/backend/controller/ImageController.java @@ -0,0 +1,5 @@ +package com.example.backend.controller; + +public class ImageController { + +} diff --git a/src/main/java/com/example/backend/controller/PermissionController.java b/src/main/java/com/example/backend/controller/PermissionController.java new file mode 100644 index 0000000..6639760 --- /dev/null +++ b/src/main/java/com/example/backend/controller/PermissionController.java @@ -0,0 +1,5 @@ +package com.example.backend.controller; + +public class PermissionController { + +} diff --git a/src/main/java/com/example/backend/controller/StateController.java b/src/main/java/com/example/backend/controller/StateController.java new file mode 100644 index 0000000..56eb309 --- /dev/null +++ b/src/main/java/com/example/backend/controller/StateController.java @@ -0,0 +1,5 @@ +package com.example.backend.controller; + +public class StateController { + +} diff --git a/src/main/java/com/example/backend/dto/LoginRequest.java b/src/main/java/com/example/backend/dto/LoginRequest.java new file mode 100644 index 0000000..b50b49b --- /dev/null +++ b/src/main/java/com/example/backend/dto/LoginRequest.java @@ -0,0 +1,11 @@ +package com.example.backend.dto; + +import lombok.*; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class LoginRequest { + private String username; + private String password; +} diff --git a/src/main/java/com/example/backend/entity/Image.java b/src/main/java/com/example/backend/entity/Image.java new file mode 100644 index 0000000..92358ee --- /dev/null +++ b/src/main/java/com/example/backend/entity/Image.java @@ -0,0 +1,5 @@ +package com.example.backend.entity; + +public class Image { + +} diff --git a/src/main/java/com/example/backend/entity/Permissions.java b/src/main/java/com/example/backend/entity/Permissions.java new file mode 100644 index 0000000..481c715 --- /dev/null +++ b/src/main/java/com/example/backend/entity/Permissions.java @@ -0,0 +1,5 @@ +package com.example.backend.entity; + +public class Permissions { + +} diff --git a/src/main/java/com/example/backend/entity/State.java b/src/main/java/com/example/backend/entity/State.java new file mode 100644 index 0000000..8748308 --- /dev/null +++ b/src/main/java/com/example/backend/entity/State.java @@ -0,0 +1,5 @@ +package com.example.backend.entity; + +public class State { + +} diff --git a/src/main/java/com/example/backend/entity/User.java b/src/main/java/com/example/backend/entity/User.java new file mode 100644 index 0000000..4f6dfd1 --- /dev/null +++ b/src/main/java/com/example/backend/entity/User.java @@ -0,0 +1,25 @@ +package com.example.backend.entity; + +import java.util.Date; + +import jakarta.persistence.*; +import lombok.*; + +@Entity +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class User { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(nullable = false, unique = true) + private String username; + + @Column(nullable = false) + private String password; + + private Date lastLogin; +} \ No newline at end of file diff --git a/src/main/java/com/example/backend/repository/ImageRepository.java b/src/main/java/com/example/backend/repository/ImageRepository.java new file mode 100644 index 0000000..9aca41a --- /dev/null +++ b/src/main/java/com/example/backend/repository/ImageRepository.java @@ -0,0 +1,5 @@ +package com.example.backend.repository; + +public class ImageRepository { + +} diff --git a/src/main/java/com/example/backend/repository/PermissionRepository.java b/src/main/java/com/example/backend/repository/PermissionRepository.java new file mode 100644 index 0000000..b84529f --- /dev/null +++ b/src/main/java/com/example/backend/repository/PermissionRepository.java @@ -0,0 +1,5 @@ +package com.example.backend.repository; + +public class PermissionRepository { + +} diff --git a/src/main/java/com/example/backend/repository/StateRepository.java b/src/main/java/com/example/backend/repository/StateRepository.java new file mode 100644 index 0000000..798c899 --- /dev/null +++ b/src/main/java/com/example/backend/repository/StateRepository.java @@ -0,0 +1,5 @@ +package com.example.backend.repository; + +public class StateRepository { + +} diff --git a/src/main/java/com/example/backend/repository/UserRepository.java b/src/main/java/com/example/backend/repository/UserRepository.java new file mode 100644 index 0000000..64a620b --- /dev/null +++ b/src/main/java/com/example/backend/repository/UserRepository.java @@ -0,0 +1,9 @@ +package com.example.backend.repository; + +import com.example.backend.entity.User; +import org.springframework.data.jpa.repository.JpaRepository; +import java.util.Optional; + +public interface UserRepository extends JpaRepository { + Optional findByUsername(String username); +} \ No newline at end of file diff --git a/src/main/java/com/example/backend/service/AuthService.java b/src/main/java/com/example/backend/service/AuthService.java new file mode 100644 index 0000000..45aa8ea --- /dev/null +++ b/src/main/java/com/example/backend/service/AuthService.java @@ -0,0 +1,25 @@ +package com.example.backend.service; + +import com.example.backend.config.JwtTokenProvider; +import com.example.backend.entity.User; +import com.example.backend.repository.UserRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.stereotype.Service; + +@Service +public class AuthService { + @Autowired + private UserRepository userRepository; + + @Autowired + private JwtTokenProvider jwtTokenProvider; + + public String login(String username, String password) { + User user = userRepository.findByUsername(username).orElseThrow(() -> new RuntimeException("User not found")); + if (!new BCryptPasswordEncoder().matches(password, user.getPassword())) { + throw new RuntimeException("Invalid credentials"); + } + return jwtTokenProvider.createToken(user.getUsername(), user.getId()); + } +} \ No newline at end of file diff --git a/src/main/java/com/example/backend/service/ImageService.java b/src/main/java/com/example/backend/service/ImageService.java new file mode 100644 index 0000000..6b4c54e --- /dev/null +++ b/src/main/java/com/example/backend/service/ImageService.java @@ -0,0 +1,5 @@ +package com.example.backend.service; + +public class ImageService { + +} diff --git a/src/main/java/com/example/backend/service/PermissionService.java b/src/main/java/com/example/backend/service/PermissionService.java new file mode 100644 index 0000000..702721c --- /dev/null +++ b/src/main/java/com/example/backend/service/PermissionService.java @@ -0,0 +1,5 @@ +package com.example.backend.service; + +public class PermissionService { + +} diff --git a/src/main/java/com/example/backend/service/StateService.java b/src/main/java/com/example/backend/service/StateService.java new file mode 100644 index 0000000..b93265a --- /dev/null +++ b/src/main/java/com/example/backend/service/StateService.java @@ -0,0 +1,5 @@ +package com.example.backend.service; + +public class StateService { + +} diff --git a/src/main/java/com/example/demo/controller/authController.java b/src/main/java/com/example/demo/controller/authController.java deleted file mode 100644 index 993cfc3..0000000 --- a/src/main/java/com/example/demo/controller/authController.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.example.demo.controller; - -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - -import com.example.demo.service.AuthService; - - -@RestController -@RequestMapping("/api/auth") -public class authController { - private final AuthService authService; - - @PostMapping("/login") - public ResponseEntity login(@RequestBody LoginRequest loginRequest) { - String token = authService.authenticate(loginRequest.getUsername(), loginRequest.getPassword()); - return ResponseEntity.ok(token); - } -} - -/* 안녕하세요 IPP 교육생 김대훈입니다. -1월 8일(수)에 IPP 관련 학교 행사에 참여하게 되어서 해당 날짜에 출근하지 않고 바로 행사장소로 간다고 합니다. -해당 사안에 관해서 학교와 인사 담당자님과 이야기 됐다고 합니다. -인사 담당자님께서 담당교사님께 전달하라고 하셔서 이렇게 메시지 보냅니다! 감사합니다. */ \ No newline at end of file diff --git a/src/main/java/com/example/demo/entity/stateEntity.java b/src/main/java/com/example/demo/entity/stateEntity.java deleted file mode 100644 index e4be2bf..0000000 --- a/src/main/java/com/example/demo/entity/stateEntity.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.example.demo.entity; - -import java.time.LocalDateTime; - -import javax.swing.SwingWorker.StateValue; - -import jakarta.persistence.*; - -@Entity -@Table(name = "states") -public class stateEntity { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long stateId; - - @ManyToOne - @JoinColumn(name = "user_id", nullable = false) - private userEntity user; - - @Enumerated(EnumType.STRING) - @Column(nullable = false) - private StateValue stateValue; - - private Double gpsLatitude; - private Double gpsLongitude; - private String address; - - @Column(nullable = false) - private LocalDateTime updatedAt = LocalDateTime.now(); - - // Getters and Setters -} - - \ No newline at end of file diff --git a/src/main/java/com/example/demo/entity/userEntity.java b/src/main/java/com/example/demo/entity/userEntity.java deleted file mode 100644 index 2462e43..0000000 --- a/src/main/java/com/example/demo/entity/userEntity.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.example.demo.entity; - -import java.time.LocalDateTime; - -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; -import jakarta.persistence.Table; - - -@Entity -@Table(name = "users") -public class userEntity { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long userId; - - @Column(nullable = false, unique = true) - private String username; - - @Column(nullable = false) - private String password; - - private LocalDateTime lastLogin; - - @Column(nullable = false, updatable = false) - private LocalDateTime createdAt = LocalDateTime.now(); - - -} diff --git a/src/main/java/com/example/demo/service/AuthService.java b/src/main/java/com/example/demo/service/AuthService.java deleted file mode 100644 index 9de4e5c..0000000 --- a/src/main/java/com/example/demo/service/AuthService.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.example.demo.service; - -public class AuthService { - -}