diff --git a/src/main/java/co/jp/app/config/CorsConfig.java b/src/main/java/co/jp/app/config/CorsConfig.java index a28c48b..ca85741 100644 --- a/src/main/java/co/jp/app/config/CorsConfig.java +++ b/src/main/java/co/jp/app/config/CorsConfig.java @@ -10,9 +10,8 @@ public class CorsConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/api/**") // 允许 /api/ 下的所有请求 - .allowedOrigins("http://192.168.1.50:5173") // 允许来自该域的请求 + .allowedOrigins("*") // 允许来自该域的请求 .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") // 允许的 HTTP 方法 - .allowedHeaders("*") // 允许所有头部 - .allowCredentials(true); // 允许发送 Cookie + .allowedHeaders("*"); // 允许所有头部 } } diff --git a/src/main/java/co/jp/app/config/security/SecurityConfig.java b/src/main/java/co/jp/app/config/security/SecurityConfig.java index 17bb6a1..3bbfdd4 100644 --- a/src/main/java/co/jp/app/config/security/SecurityConfig.java +++ b/src/main/java/co/jp/app/config/security/SecurityConfig.java @@ -1,5 +1,9 @@ package co.jp.app.config.security; +<<<<<<< HEAD +======= +import co.jp.app.config.security.filter.JwtAuthenticationFilter; +>>>>>>> 2aae88278c46cf937380317aae1f9d229bcb3c37 import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Lazy; @@ -19,11 +23,11 @@ import co.jp.app.config.security.filter.JwtAuthenticationFilter; @Configuration public class SecurityConfig { - //private final JwtAuthenticationFilter jwtAuthenticationFilter; + private final JwtAuthenticationFilter jwtAuthenticationFilter; private final UserDetailsService userDetailsService; public SecurityConfig(@Lazy JwtAuthenticationFilter jwtAuthenticationFilter, @Lazy UserDetailsService userDetailsService) { - //this.jwtAuthenticationFilter = jwtAuthenticationFilter; + this.jwtAuthenticationFilter = jwtAuthenticationFilter; this.userDetailsService = userDetailsService; } @@ -45,29 +49,18 @@ public class SecurityConfig { return authenticationConfiguration.getAuthenticationManager(); } -// @Bean -// public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { -// http.csrf(AbstractHttpConfigurer::disable) -// .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) -// .authorizeHttpRequests(auth -> auth -// .requestMatchers("/api/user/login", "/api/user/register").permitAll() -// .anyRequest().authenticated() -// ) -// .authenticationProvider(authenticationProvider()) -// .addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class); -// -// return http.build(); -// } - @Bean - //暂时开放所有权限 public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { - http.csrf(AbstractHttpConfigurer::disable) + .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) .authorizeHttpRequests(auth -> auth - .anyRequest().permitAll() - ); + .requestMatchers("/api/user/login", "/api/user/register", "/api/inuhouse").permitAll() + .anyRequest().authenticated() + ) + .authenticationProvider(authenticationProvider()) + .addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class); return http.build(); } + } diff --git a/src/main/java/co/jp/app/config/security/filter/JwtAuthenticationFilter.java b/src/main/java/co/jp/app/config/security/filter/JwtAuthenticationFilter.java index c29dded..802300b 100644 --- a/src/main/java/co/jp/app/config/security/filter/JwtAuthenticationFilter.java +++ b/src/main/java/co/jp/app/config/security/filter/JwtAuthenticationFilter.java @@ -11,6 +11,7 @@ import org.springframework.security.web.authentication.WebAuthenticationDetailsS import org.springframework.stereotype.Component; import org.springframework.web.filter.OncePerRequestFilter; +<<<<<<< HEAD import co.jp.app.service.JwtService; import jakarta.servlet.FilterChain; import jakarta.servlet.ServletException; @@ -18,6 +19,8 @@ import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; +======= +>>>>>>> 2aae88278c46cf937380317aae1f9d229bcb3c37 @Component public class JwtAuthenticationFilter extends OncePerRequestFilter { diff --git a/src/main/java/co/jp/app/controller/UserController.java b/src/main/java/co/jp/app/controller/UserController.java index 6324317..fa8e107 100644 --- a/src/main/java/co/jp/app/controller/UserController.java +++ b/src/main/java/co/jp/app/controller/UserController.java @@ -4,6 +4,7 @@ import co.jp.app.common.ApiResponse; import co.jp.app.common.ResultCode; import co.jp.app.dto.LoginDto; import co.jp.app.dto.RegistrationDto; +import co.jp.app.dto.UserDto; import co.jp.app.service.JwtService; import jakarta.validation.Valid; import org.springframework.http.HttpStatus; @@ -37,40 +38,32 @@ public class UserController { } @PostMapping("/register") - public ResponseEntity registerUser(@Valid @RequestBody RegistrationDto registrationDto) { - try { + public ResponseEntity> registerUser(@Valid @RequestBody RegistrationDto registrationDto) { - UserEntity registeredUser = userService.registerNewUser(registrationDto); + UserEntity registeredUser = userService.registerNewUser(registrationDto); - return ResponseEntity.status(HttpStatus.CREATED).body(ApiResponse.success(registeredUser.getEmail())); - } catch (Exception e) { + UserDto userDto = new UserDto(); - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(ApiResponse.fail(ResultCode.BAD_REQUEST,null)); - } + userDto.setEmail(registeredUser.getEmail()); + userDto.setName(registeredUser.getName()); + + return ResponseEntity.status(HttpStatus.CREATED).body(ApiResponse.success(userDto)); } @PostMapping("/login") - public ResponseEntity authenticateUser(@Valid @RequestBody LoginDto loginDto) { - try { - Authentication authentication = authenticationManager.authenticate( - new UsernamePasswordAuthenticationToken(loginDto.getEmail(), loginDto.getPassword()) - ); - SecurityContextHolder.getContext().setAuthentication(authentication); - UserDetails userDetails = (UserDetails) authentication.getPrincipal(); + public ResponseEntity>> authenticateUser(@Valid @RequestBody LoginDto loginDto) { - String jwtToken = jwtService.generateToken(userDetails); + Authentication authentication = authenticationManager.authenticate( + new UsernamePasswordAuthenticationToken(loginDto.getEmail(), loginDto.getPassword()) + ); + SecurityContextHolder.getContext().setAuthentication(authentication); + UserDetails userDetails = (UserDetails) authentication.getPrincipal(); - Map tokenResponse = new HashMap<>(); - tokenResponse.put("token", jwtToken); + String jwtToken = jwtService.generateToken(userDetails); - return ResponseEntity.ok(ApiResponse.success(tokenResponse)); + Map tokenResponse = new HashMap<>(); + tokenResponse.put("token", jwtToken); - } catch (BadCredentialsException e) { - - return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body(ApiResponse.fail(ResultCode.UNAUTHORIZED,null)); - } catch (Exception e) { - - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(ApiResponse.fail(ResultCode.SERVICE_UNAVAILABLE,null)); - } + return ResponseEntity.ok(ApiResponse.success(tokenResponse)); } } diff --git a/src/main/java/co/jp/app/dto/UserDto.java b/src/main/java/co/jp/app/dto/UserDto.java new file mode 100644 index 0000000..42b21ba --- /dev/null +++ b/src/main/java/co/jp/app/dto/UserDto.java @@ -0,0 +1,24 @@ +package co.jp.app.dto; + +public class UserDto { + + private String email; + + private String name; + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/src/main/java/co/jp/app/service/UserService.java b/src/main/java/co/jp/app/service/UserService.java index 5dbfd72..05a641a 100644 --- a/src/main/java/co/jp/app/service/UserService.java +++ b/src/main/java/co/jp/app/service/UserService.java @@ -3,6 +3,8 @@ package co.jp.app.service; import java.util.Collection; import java.util.Collections; +import co.jp.app.common.ResultCode; +import co.jp.app.exception.BusinessException; import org.jetbrains.annotations.NotNull; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.authority.SimpleGrantedAuthority; @@ -30,10 +32,15 @@ public class UserService implements UserDetailsService { } @Transactional - public UserEntity registerNewUser(@NotNull RegistrationDto registrationDto) throws Exception { + public UserEntity registerNewUser(@NotNull RegistrationDto registrationDto) throws BusinessException { if (userRepository.existsByEmail(registrationDto.getEmail())) { - throw new Exception("error: Email" + registrationDto.getEmail() + " had been used"); + throw new BusinessException(ResultCode.USER_EMAIL_ALREADY_EXISTS,"error: Email" + registrationDto.getEmail() + " had been used"); + } + + //密码最短6位限制 + if (registrationDto.getPassword() == null || registrationDto.getPassword().length() < 6) { + throw new BusinessException(ResultCode.USER_PASSWORD_TOO_SHORT); } UserEntity newUser = new UserEntity(); diff --git a/src/test/java/co/jp/app/dogtestbyadmin/UserServiceTest.java b/src/test/java/co/jp/app/dogtestbyadmin/UserServiceTest.java new file mode 100644 index 0000000..51d165c --- /dev/null +++ b/src/test/java/co/jp/app/dogtestbyadmin/UserServiceTest.java @@ -0,0 +1,66 @@ +package co.jp.app.dogtestbyadmin; + +import co.jp.app.dto.LoginDto; +import co.jp.app.dto.RegistrationDto; +import co.jp.app.dto.UserDto; +import co.jp.app.entity.UserEntity; +import co.jp.app.repository.UserRepository; +import co.jp.app.service.UserService; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.security.crypto.password.PasswordEncoder; + +@SpringBootTest +@ExtendWith(MockitoExtension.class) +public class UserServiceTest { + + @Mock + private UserRepository userRepository; + + @Mock + private PasswordEncoder passwordEncoder; + + @InjectMocks + private UserService userService; + + private RegistrationDto registrationDto; + private LoginDto loginDto; + private UserDto userDto; + private UserEntity userEntity; + + @BeforeEach + void setUp() { + registrationDto = new RegistrationDto(); + registrationDto.setEmail(""); + registrationDto.setName("test"); + registrationDto.setPassword(""); + + loginDto = new LoginDto(); + loginDto.setEmail(""); + loginDto.setPassword(""); + + userDto = new UserDto(); + userDto.setEmail(""); + userDto.setName("test"); + } + + @Test + void testRegisterNewUser () throws Exception{ + + } + + @Test + void testRegisterNewUser() throws Exception{ + + } + + @Test + void TestLoadUserByUsername() throws Exception{ + + } +} diff --git a/target/classes/co/jp/app/config/CorsConfig.class b/target/classes/co/jp/app/config/CorsConfig.class index e3e0bf6..7ea8556 100644 Binary files a/target/classes/co/jp/app/config/CorsConfig.class and b/target/classes/co/jp/app/config/CorsConfig.class differ diff --git a/target/classes/co/jp/app/config/security/SecurityConfig.class b/target/classes/co/jp/app/config/security/SecurityConfig.class index 6c5a43c..625ef69 100644 Binary files a/target/classes/co/jp/app/config/security/SecurityConfig.class and b/target/classes/co/jp/app/config/security/SecurityConfig.class differ diff --git a/target/classes/co/jp/app/config/security/filter/JwtAuthenticationFilter.class b/target/classes/co/jp/app/config/security/filter/JwtAuthenticationFilter.class index 1227cc1..1e9d7a1 100644 Binary files a/target/classes/co/jp/app/config/security/filter/JwtAuthenticationFilter.class and b/target/classes/co/jp/app/config/security/filter/JwtAuthenticationFilter.class differ diff --git a/target/classes/co/jp/app/controller/UserController.class b/target/classes/co/jp/app/controller/UserController.class index f322e03..4a17402 100644 Binary files a/target/classes/co/jp/app/controller/UserController.class and b/target/classes/co/jp/app/controller/UserController.class differ diff --git a/target/test-classes/co/jp/app/dogtestbyadmin/UserServiceTest.class b/target/test-classes/co/jp/app/dogtestbyadmin/UserServiceTest.class new file mode 100644 index 0000000..7c79a19 Binary files /dev/null and b/target/test-classes/co/jp/app/dogtestbyadmin/UserServiceTest.class differ