diff --git a/build.gradle b/build.gradle index 2f2eaae..b118e3d 100644 --- a/build.gradle +++ b/build.gradle @@ -7,7 +7,6 @@ plugins { group = 'com.example' version = '0.0.1-SNAPSHOT' description = 'NODE' - java { toolchain { languageVersion = JavaLanguageVersion.of(17) @@ -27,6 +26,14 @@ repositories { dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-web' + implementation 'org.springframework.boot:spring-boot-starter-security' + implementation 'org.springframework.security:spring-security-test' + implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity6' + implementation 'io.jsonwebtoken:jjwt-api:0.12.3' + runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.12.3' + runtimeOnly 'io.jsonwebtoken:jjwt-jackson:0.12.3' + implementation 'com.mysql:mysql-connector-j' + runtimeOnly 'com.h2database:h2' compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' @@ -35,4 +42,4 @@ dependencies { tasks.named('test') { useJUnitPlatform() -} +} \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index c2cd860..d71bf44 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1 @@ -rootProject.name = 'NODE' +rootProject.name = 'NODE' \ No newline at end of file diff --git a/src/main/java/com/example/nodelogin/NodeLoginApplication.java b/src/main/java/com/example/nodelogin/NodeLoginApplication.java new file mode 100644 index 0000000..2e80e22 --- /dev/null +++ b/src/main/java/com/example/nodelogin/NodeLoginApplication.java @@ -0,0 +1,13 @@ +package com.example.nodelogin; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class NodeLoginApplication { + + public static void main(String[] args) { + SpringApplication.run(NodeLoginApplication.class, args); + } + +} diff --git a/src/main/java/com/example/nodelogin/config/SecurityConfig.java b/src/main/java/com/example/nodelogin/config/SecurityConfig.java new file mode 100644 index 0000000..e79883e --- /dev/null +++ b/src/main/java/com/example/nodelogin/config/SecurityConfig.java @@ -0,0 +1,103 @@ +package com.example.nodelogin.config; + +import com.example.nodelogin.jwt.JWTFilter; +import com.example.nodelogin.jwt.JWTUtil; +import com.example.nodelogin.jwt.LoginFilter; +import jakarta.servlet.http.HttpServletRequest; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration; +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; +import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; +import org.springframework.web.cors.CorsConfiguration; +import org.springframework.web.cors.CorsConfigurationSource; + +import java.util.Collections; + +import static com.fasterxml.jackson.databind.type.LogicalType.Collection; + +@Configuration +@EnableWebSecurity +public class SecurityConfig { + + private final AuthenticationConfiguration authenticationConfiguration; + + private final JWTUtil jwtUtil; + + public SecurityConfig(AuthenticationConfiguration authenticationConfiguration, JWTUtil jwtUtil) { + this.authenticationConfiguration = authenticationConfiguration; + this.jwtUtil = jwtUtil; + } + + @Bean + public AuthenticationManager authenticationManager(AuthenticationConfiguration configuration) throws Exception { + return configuration.getAuthenticationManager(); + } + + @Bean + public BCryptPasswordEncoder bCryptPasswordEncoder() { + return new BCryptPasswordEncoder(); + } + + @Bean + public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { + + http + .cors((cors) -> cors + .configurationSource(new CorsConfigurationSource() { + + @Override + public CorsConfiguration getCorsConfiguration(HttpServletRequest request) { + + CorsConfiguration configuration = new CorsConfiguration(); + + configuration.setAllowedOrigins(Collections.singletonList("http://localhost:3000")); + configuration.setAllowedMethods(Collections.singletonList("*")); + configuration.setAllowCredentials(true); + configuration.setAllowedHeaders(Collections.singletonList("*")); + configuration.setMaxAge(3600L); + + configuration.setExposedHeaders(Collections.singletonList("Authorization")); + + return configuration; + } + })); + + http + .csrf(auth -> auth.disable()); + + http + .formLogin((auth) -> auth.disable()); + + http + .httpBasic((auth) -> auth.disable()); + + http + .authorizeHttpRequests((auth) -> auth + .requestMatchers("/user/login", "/", "/user/join").permitAll() + .requestMatchers("/admin").hasRole("ADMIN") + .anyRequest().authenticated()); + + http + .sessionManagement((session) -> session + .sessionCreationPolicy(SessionCreationPolicy.STATELESS)); + + http.addFilterAt( + new LoginFilter(authenticationManager(authenticationConfiguration), jwtUtil), + UsernamePasswordAuthenticationFilter.class + ); + + + http.addFilterBefore( + new JWTFilter(jwtUtil), + UsernamePasswordAuthenticationFilter.class + ); + + return http.build(); + } +} diff --git a/src/main/java/com/example/nodelogin/jwt/JWTFilter.java b/src/main/java/com/example/nodelogin/jwt/JWTFilter.java new file mode 100644 index 0000000..58ef149 --- /dev/null +++ b/src/main/java/com/example/nodelogin/jwt/JWTFilter.java @@ -0,0 +1,60 @@ +package com.example.nodelogin.jwt; + +import com.example.nodelogin.user.dto.CustomUserDetails; +import com.example.nodelogin.user.entity.UserEntity; +import jakarta.servlet.FilterChain; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.web.filter.OncePerRequestFilter; + +public class JWTFilter extends OncePerRequestFilter { + + private final JWTUtil jwtUtil; + + public JWTFilter(JWTUtil jwtUtil) { + this.jwtUtil = jwtUtil; + } + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) + throws java.io.IOException, jakarta.servlet.ServletException { + + String authorization = request.getHeader("Authorization"); + + if (authorization == null || !authorization.startsWith("Bearer ")) { + + System.out.println("token null"); + filterChain.doFilter(request, response); + return; + + } + + String token = authorization.split(" ")[1]; + + if (jwtUtil.isExpired(token)) { + System.out.println("token expired"); + filterChain.doFilter(request, response); + + return; + } + + String username = jwtUtil.getUsername(token); + String role = jwtUtil.getRole(token); + + UserEntity userEntity = new UserEntity(); + userEntity.setUsername(username); + userEntity.setPassword("temppassword"); + userEntity.setRole(UserEntity.Role.valueOf(role)); + + CustomUserDetails customUserDetails = new CustomUserDetails(userEntity); + + Authentication authToken = new UsernamePasswordAuthenticationToken(customUserDetails, null, customUserDetails.getAuthorities()); + + SecurityContextHolder.getContext().setAuthentication(authToken); + + filterChain.doFilter(request, response); + } +} diff --git a/src/main/java/com/example/nodelogin/jwt/JWTUtil.java b/src/main/java/com/example/nodelogin/jwt/JWTUtil.java new file mode 100644 index 0000000..a88d5ef --- /dev/null +++ b/src/main/java/com/example/nodelogin/jwt/JWTUtil.java @@ -0,0 +1,55 @@ +package com.example.nodelogin.jwt; + +import io.jsonwebtoken.Jwts; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.stereotype.Component; + +import javax.crypto.SecretKey; +import javax.crypto.spec.SecretKeySpec; +import java.nio.charset.StandardCharsets; +import java.util.Date; + +@Component +public class JWTUtil { + + private SecretKey secretKey; + private Long accessExpiration; + + public JWTUtil(@Value("${JWT_SECRET}")String secret, @Value("${JWT_ACCESS_EXPIRATION}") Long accessExpiration) { + this.secretKey = new SecretKeySpec(secret.getBytes(StandardCharsets.UTF_8), Jwts.SIG.HS256.key().build().getAlgorithm()); + this.accessExpiration = accessExpiration; + } + + public String getUsername(String token) { + return Jwts.parser().verifyWith(secretKey).build().parseSignedClaims(token).getPayload().get("username", String.class); + } + + public String getEmail(String token) { + return Jwts.parser().verifyWith(secretKey).build().parseSignedClaims(token).getPayload().get("email", String.class); + } + + public String getRole(String token) { + return Jwts.parser().verifyWith(secretKey).build().parseSignedClaims(token).getPayload().get("role", String.class); + } + + public boolean isExpired(String token) { + return Jwts.parser().verifyWith(secretKey).build().parseSignedClaims(token).getPayload().getExpiration().before(new Date()); + } + + public String createJwt(UserDetails userDetails) { + String username = userDetails.getUsername(); + String role = userDetails.getAuthorities().iterator().next().getAuthority(); + return createJwt(username, role, accessExpiration); + } + + public String createJwt(String email, String role, Long expiredMs) { + return Jwts.builder() + .claim("email", email) + .claim("role", role) + .issuedAt(new Date()) + .setExpiration(new Date(System.currentTimeMillis() + expiredMs)) + .signWith(secretKey) + .compact(); + } +} diff --git a/src/main/java/com/example/nodelogin/jwt/LoginFilter.java b/src/main/java/com/example/nodelogin/jwt/LoginFilter.java new file mode 100644 index 0000000..ca55d92 --- /dev/null +++ b/src/main/java/com/example/nodelogin/jwt/LoginFilter.java @@ -0,0 +1,73 @@ +package com.example.nodelogin.jwt; + +import com.example.nodelogin.user.dto.CustomUserDetails; +import com.example.nodelogin.user.dto.LoginDto; +import com.fasterxml.jackson.databind.ObjectMapper; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; + +import java.io.IOException; +import java.util.Collection; +import java.util.Iterator; + +public class LoginFilter extends UsernamePasswordAuthenticationFilter { + + private final AuthenticationManager authenticationManager; + + private final JWTUtil jwtUtil; + + public LoginFilter(AuthenticationManager authenticationManager, JWTUtil jwtUtil) { + + this.authenticationManager = authenticationManager; + this.jwtUtil = jwtUtil; + + setFilterProcessesUrl("/user/login"); + + } + + @Override + public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException { + + try{ + LoginDto loginDto = new ObjectMapper().readValue(request.getInputStream(), LoginDto.class); + + UsernamePasswordAuthenticationToken authToken = new UsernamePasswordAuthenticationToken(loginDto.getEmail(), loginDto.getPassword()); + + return authenticationManager.authenticate(authToken); + }catch (IOException e) { + throw new RuntimeException(e); + } + } + + @Override + protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain, Authentication authentication) throws IOException, ServletException { + + CustomUserDetails customUserDetails = (CustomUserDetails)authentication.getPrincipal(); + + String username = customUserDetails.getUsername(); + + Collection authorities = authentication.getAuthorities(); + Iterator iterator = authorities.iterator(); + GrantedAuthority auth = iterator.next(); + + String role = auth.getAuthority(); + + String token = jwtUtil.createJwt(customUserDetails); + + response.addHeader("Authorization", "Bearer " + token); + } + + @Override + protected void unsuccessfulAuthentication(HttpServletRequest request, HttpServletResponse response, AuthenticationException failed) throws IOException, ServletException { + + response.setStatus(401); + } +} diff --git a/src/main/java/com/example/nodelogin/user/controller/AdminController.java b/src/main/java/com/example/nodelogin/user/controller/AdminController.java new file mode 100644 index 0000000..611ee03 --- /dev/null +++ b/src/main/java/com/example/nodelogin/user/controller/AdminController.java @@ -0,0 +1,13 @@ +package com.example.nodelogin.user.controller; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + + +@Controller +public class AdminController { + + @PostMapping("/admin") + public String adminP() { + return "admin Controller"; + } +} \ No newline at end of file diff --git a/src/main/java/com/example/nodelogin/user/controller/JoinController.java b/src/main/java/com/example/nodelogin/user/controller/JoinController.java new file mode 100644 index 0000000..27e3562 --- /dev/null +++ b/src/main/java/com/example/nodelogin/user/controller/JoinController.java @@ -0,0 +1,25 @@ +package com.example.nodelogin.user.controller; + +import com.example.nodelogin.user.dto.JoinDto; +import com.example.nodelogin.user.service.JoinService; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/user") +public class JoinController { + + private final JoinService joinService; + + public JoinController(JoinService joinService) { + this.joinService = joinService; + } + + @PostMapping("/join") + public String join(@RequestBody JoinDto joinDto) { + joinService.joinProcess(joinDto); + return "ok"; + } +} diff --git a/src/main/java/com/example/nodelogin/user/controller/LoginController.java b/src/main/java/com/example/nodelogin/user/controller/LoginController.java new file mode 100644 index 0000000..30e5cf8 --- /dev/null +++ b/src/main/java/com/example/nodelogin/user/controller/LoginController.java @@ -0,0 +1,51 @@ +package com.example.nodelogin.user.controller; + +import com.example.nodelogin.jwt.JWTUtil; +import org.apache.coyote.Response; +import org.springframework.http.ResponseEntity; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.example.nodelogin.user.dto.LoginDto; + +import java.util.Map; + +@RestController +@RequestMapping("/user") +public class LoginController { + private AuthenticationManager authenticationManager; + private final JWTUtil jwtUtil; + + public LoginController(AuthenticationManager authenticationManager, JWTUtil jwtUtil) { + this.authenticationManager = authenticationManager; + this.jwtUtil = jwtUtil; + } + + @PostMapping + public ResponseEntity login(@RequestBody LoginDto loginDto) { + try{ + Authentication authentication = authenticationManager.authenticate( + new UsernamePasswordAuthenticationToken(loginDto.getEmail(), loginDto.getPassword()) + ); + + UserDetails userDetails = (UserDetails) authentication.getPrincipal(); + String accessToken = jwtUtil.createJwt(userDetails); + String refreshToken = jwtUtil.createJwt(userDetails); + + return ResponseEntity.ok( + Map.of( + "accessToken", accessToken, + "refreshToken", refreshToken, + "email", userDetails.getUsername() + ) + ); + }catch (Exception e) { + return ResponseEntity.status(401).body(Map.of("error", "Invalid email or password()")); + } + } +} diff --git a/src/main/java/com/example/nodelogin/user/controller/MainController.java b/src/main/java/com/example/nodelogin/user/controller/MainController.java new file mode 100644 index 0000000..ef5b66e --- /dev/null +++ b/src/main/java/com/example/nodelogin/user/controller/MainController.java @@ -0,0 +1,27 @@ +package com.example.nodelogin.user.controller; + +import org.springframework.security.core.Authentication; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; + +import java.util.Collection; +import java.util.Iterator; + +@Controller +public class MainController { + + @GetMapping("/") + public String mainP() { + String username = SecurityContextHolder.getContext().getAuthentication().getName(); + + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + + Collection authorites = authentication.getAuthorities(); + Iterator iterator = authorites.iterator(); + GrantedAuthority auth = iterator.next(); + String role = auth.getAuthority(); + return "Main Controller" + username + role; + } +} diff --git a/src/main/java/com/example/nodelogin/user/dto/CustomUserDetails.java b/src/main/java/com/example/nodelogin/user/dto/CustomUserDetails.java new file mode 100644 index 0000000..fa4ba35 --- /dev/null +++ b/src/main/java/com/example/nodelogin/user/dto/CustomUserDetails.java @@ -0,0 +1,64 @@ +package com.example.nodelogin.user.dto; + +import com.example.nodelogin.user.entity.UserEntity; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.userdetails.UserDetails; + +import java.util.ArrayList; +import java.util.Collection; + +public class CustomUserDetails implements UserDetails { + + private final UserEntity userEntity; + + public CustomUserDetails(UserEntity userEntity) { + + this.userEntity = userEntity; + + } + + @Override + public Collection getAuthorities() { + + Collection collection = new ArrayList<>(); + + collection.add(new GrantedAuthority() { + @Override + public String getAuthority() { + return userEntity.getRole().name(); + } + }); + + return collection; + } + + @Override + public String getPassword() { + return userEntity.getPassword(); + } + + @Override + public String getUsername() { + return userEntity.getEmail(); + } + + @Override + public boolean isAccountNonExpired() { + return true; + } + + @Override + public boolean isAccountNonLocked() { + return true; + } + + @Override + public boolean isCredentialsNonExpired() { + return true; + } + + @Override + public boolean isEnabled() { + return true; + } +} diff --git a/src/main/java/com/example/nodelogin/user/dto/JoinDto.java b/src/main/java/com/example/nodelogin/user/dto/JoinDto.java new file mode 100644 index 0000000..2aec26f --- /dev/null +++ b/src/main/java/com/example/nodelogin/user/dto/JoinDto.java @@ -0,0 +1,22 @@ +package com.example.nodelogin.user.dto; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import com.example.nodelogin.user.entity.UserEntity; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +public class JoinDto { + private UserEntity.Role role; + private UserEntity.Picture picture; + private String username; + private String password; + private String email; + private String gender; + private Integer grade; + private Integer classNumber; + private String specialty; +} \ No newline at end of file diff --git a/src/main/java/com/example/nodelogin/user/dto/LoginDto.java b/src/main/java/com/example/nodelogin/user/dto/LoginDto.java new file mode 100644 index 0000000..8e3faa6 --- /dev/null +++ b/src/main/java/com/example/nodelogin/user/dto/LoginDto.java @@ -0,0 +1,15 @@ +package com.example.nodelogin.user.dto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +public class LoginDto { + private String email; + private String password; +} diff --git a/src/main/java/com/example/nodelogin/user/entity/UserEntity.java b/src/main/java/com/example/nodelogin/user/entity/UserEntity.java new file mode 100644 index 0000000..ba131f8 --- /dev/null +++ b/src/main/java/com/example/nodelogin/user/entity/UserEntity.java @@ -0,0 +1,58 @@ +package com.example.nodelogin.user.entity; +import jakarta.persistence.*; +import lombok.*; + +@Entity +@Getter @Setter +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class UserEntity { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private long loginId; + + @Column(nullable = false, unique = true) + private String email; + + @Column(nullable = false) + private String password; + + @Column(nullable = false) + private String gender; + + @Column(nullable = false) + private String username; + + @Column(nullable = false) + private Integer grade; + + @Column(nullable = false) + private Integer classNumber; + + @Column(nullable = false) + private String specialty; + + @Enumerated(EnumType.STRING) + private Role role; + public enum Role { + ADMIN, + USER + } + + @Enumerated(EnumType.STRING) + private UserType userType; + public enum UserType { + MENTOR, + MENTEE + } + + @Enumerated(EnumType.STRING) + private Picture picture; + public enum Picture { + PICTURE1, + PICTURE2, + PICTURE3, + PICTURE4 + } +} diff --git a/src/main/java/com/example/nodelogin/user/repository/UserRepository.java b/src/main/java/com/example/nodelogin/user/repository/UserRepository.java new file mode 100644 index 0000000..e1b41de --- /dev/null +++ b/src/main/java/com/example/nodelogin/user/repository/UserRepository.java @@ -0,0 +1,12 @@ +package com.example.nodelogin.user.repository; +import com.example.nodelogin.user.entity.UserEntity; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.Optional; + +public interface UserRepository extends JpaRepository { + + boolean existsByUsername (String username); + UserEntity findByUsername(String username); + UserEntity findByEmail(String email); +} \ No newline at end of file diff --git a/src/main/java/com/example/nodelogin/user/service/CustomUserDetailsService.java b/src/main/java/com/example/nodelogin/user/service/CustomUserDetailsService.java new file mode 100644 index 0000000..efc1b27 --- /dev/null +++ b/src/main/java/com/example/nodelogin/user/service/CustomUserDetailsService.java @@ -0,0 +1,31 @@ +package com.example.nodelogin.user.service; + +import com.example.nodelogin.user.dto.CustomUserDetails; +import com.example.nodelogin.user.entity.UserEntity; +import com.example.nodelogin.user.repository.UserRepository; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.stereotype.Service; + +@Service +public class CustomUserDetailsService implements UserDetailsService { + + private final UserRepository userRepository; + + public CustomUserDetailsService(UserRepository userRepository) { + this.userRepository = userRepository; + } + + @Override + public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException { + + UserEntity userData = userRepository.findByEmail(email); + + if (userData == null) { + throw new UsernameNotFoundException("User not found: " + email); + } + + return new CustomUserDetails(userData); + } +} \ No newline at end of file diff --git a/src/main/java/com/example/nodelogin/user/service/JoinService.java b/src/main/java/com/example/nodelogin/user/service/JoinService.java new file mode 100644 index 0000000..4cf0b7a --- /dev/null +++ b/src/main/java/com/example/nodelogin/user/service/JoinService.java @@ -0,0 +1,56 @@ +package com.example.nodelogin.user.service; +import com.example.nodelogin.user.dto.JoinDto; +import com.example.nodelogin.user.entity.UserEntity; +import lombok.RequiredArgsConstructor; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.stereotype.Service; +import com.example.nodelogin.user.repository.UserRepository; + +@Service +public class JoinService { + + private final UserRepository userRepository; + + private final BCryptPasswordEncoder bCryptPasswordEncoder; + + public JoinService(UserRepository userRepository, BCryptPasswordEncoder bCryptPasswordEncoder) { + + this.userRepository = userRepository; + this.bCryptPasswordEncoder = bCryptPasswordEncoder; + + } + + public void joinProcess(JoinDto joinDto) { + + String username = joinDto.getUsername(); + String password = joinDto.getPassword(); + UserEntity.Role role = joinDto.getRole(); + String email = joinDto.getEmail(); + String specialty = joinDto.getSpecialty(); + String gender = joinDto.getGender(); + Integer grade = joinDto.getGrade(); + Integer classNumber = joinDto.getClassNumber(); + UserEntity.Picture picture = joinDto.getPicture(); + + Boolean exists = userRepository.existsByUsername(username); + + if (exists) { + return; + } + + UserEntity data = new UserEntity(); + + data.setUsername(username); + data.setPassword(bCryptPasswordEncoder.encode(password)); + data.setRole(role); + data.setEmail(email); + data.setGender(gender); + data.setGrade(grade); + data.setClassNumber(classNumber); + data.setPicture(picture); + data.setSpecialty(specialty); + + userRepository.save(data); + + } +} \ No newline at end of file diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index ab6b3e0..48a0de6 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1 +1,14 @@ spring.application.name=NODE + +spring.datasource.url=${DB_HOST} +spring.datasource.username=${DB_USER} +spring.datasource.password=${DB_PASSWORD} +spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver + +spring.jpa.hibernate.ddl-auto=${DB_DDL} +spring.jpa.show-sql=true +spring.jpa.properties.hibernate.format_sql=true + +jwt.secret=${JWT_SECRET} +jwt.access-expiration=${JWT_ACCESS_EXPIRATION} +jwt.refresh-expiration=${JWT_REFRESH_EXPIRATION} diff --git a/src/test/java/com/example/nodelogin/NodeLoginApplicationTests.java b/src/test/java/com/example/nodelogin/NodeLoginApplicationTests.java new file mode 100644 index 0000000..f48a0a1 --- /dev/null +++ b/src/test/java/com/example/nodelogin/NodeLoginApplicationTests.java @@ -0,0 +1,13 @@ +package com.example.nodelogin; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class NodeLoginApplicationTests { + + @Test + void contextLoads() { + } + +}