From 8535dce0940f48f8046e5d959cdaa7f17f1297ad Mon Sep 17 00:00:00 2001 From: admin Date: Wed, 14 May 2025 12:48:14 +0900 Subject: [PATCH 1/5] =?UTF-8?q?chian=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/config/security/SecurityConfig.java | 30 ++++++------------- .../filter/JwtAuthenticationFilter.java | 1 - 2 files changed, 9 insertions(+), 22 deletions(-) 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 a912e8c..b0af187 100644 --- a/src/main/java/co/jp/app/config/security/SecurityConfig.java +++ b/src/main/java/co/jp/app/config/security/SecurityConfig.java @@ -1,7 +1,6 @@ package co.jp.app.config.security; import co.jp.app.config.security.filter.JwtAuthenticationFilter; -import co.jp.app.service.UserService; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Lazy; @@ -21,11 +20,11 @@ import org.springframework.security.web.authentication.UsernamePasswordAuthentic @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; } @@ -47,29 +46,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 7102e75..2156dd0 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 @@ -16,7 +16,6 @@ import org.springframework.security.web.authentication.WebAuthenticationDetailsS import org.springframework.stereotype.Component; import org.springframework.web.filter.OncePerRequestFilter; - @Component public class JwtAuthenticationFilter extends OncePerRequestFilter { From 6a579104bac2720da7d6bf099a20a011aad22713 Mon Sep 17 00:00:00 2001 From: admin Date: Wed, 14 May 2025 12:54:02 +0900 Subject: [PATCH 2/5] =?UTF-8?q?=E5=BA=94=E7=94=A8=E5=85=A8=E5=B1=80?= =?UTF-8?q?=E5=BC=82=E5=B8=B8=E6=8A=9B=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../co/jp/app/controller/UserController.java | 35 ++++++------------- .../java/co/jp/app/service/UserService.java | 11 ++++-- 2 files changed, 20 insertions(+), 26 deletions(-) diff --git a/src/main/java/co/jp/app/controller/UserController.java b/src/main/java/co/jp/app/controller/UserController.java index 6324317..ce8ed90 100644 --- a/src/main/java/co/jp/app/controller/UserController.java +++ b/src/main/java/co/jp/app/controller/UserController.java @@ -38,39 +38,26 @@ public class UserController { @PostMapping("/register") public ResponseEntity registerUser(@Valid @RequestBody RegistrationDto registrationDto) { - try { - UserEntity registeredUser = userService.registerNewUser(registrationDto); + UserEntity registeredUser = userService.registerNewUser(registrationDto); - return ResponseEntity.status(HttpStatus.CREATED).body(ApiResponse.success(registeredUser.getEmail())); - } catch (Exception e) { - - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(ApiResponse.fail(ResultCode.BAD_REQUEST,null)); - } + return ResponseEntity.status(HttpStatus.CREATED).body(ApiResponse.success(registeredUser.getEmail())); } @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(); - 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/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(); From b6bcc69a837fd55e0917deba9be54609a1c47abf Mon Sep 17 00:00:00 2001 From: admin Date: Wed, 14 May 2025 12:55:23 +0900 Subject: [PATCH 3/5] =?UTF-8?q?=E6=9B=B4=E6=94=B9allowCredentials=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE=E3=80=82allowedOrigins=E5=85=81=E8=AE=B8=E6=89=80?= =?UTF-8?q?=E6=9C=89=E8=AE=BE=E5=A4=87=E5=8F=91=E9=80=81=E8=AF=B7=E6=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/co/jp/app/config/CorsConfig.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) 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("*"); // 允许所有头部 } } From f04ab7a947931456ec222dc699283c5acffa7417 Mon Sep 17 00:00:00 2001 From: admin Date: Wed, 14 May 2025 13:11:40 +0900 Subject: [PATCH 4/5] =?UTF-8?q?=E5=A2=9E=E5=8A=A0Userdto=E4=BC=A0=E9=80=92?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E6=B3=A8=E5=86=8C=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../co/jp/app/controller/UserController.java | 12 +++++++--- src/main/java/co/jp/app/dto/UserDto.java | 24 +++++++++++++++++++ 2 files changed, 33 insertions(+), 3 deletions(-) create mode 100644 src/main/java/co/jp/app/dto/UserDto.java diff --git a/src/main/java/co/jp/app/controller/UserController.java b/src/main/java/co/jp/app/controller/UserController.java index ce8ed90..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,15 +38,20 @@ public class UserController { } @PostMapping("/register") - public ResponseEntity registerUser(@Valid @RequestBody RegistrationDto registrationDto) { + public ResponseEntity> registerUser(@Valid @RequestBody RegistrationDto registrationDto) { UserEntity registeredUser = userService.registerNewUser(registrationDto); - return ResponseEntity.status(HttpStatus.CREATED).body(ApiResponse.success(registeredUser.getEmail())); + UserDto userDto = new UserDto(); + + 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) { + public ResponseEntity>> authenticateUser(@Valid @RequestBody LoginDto loginDto) { Authentication authentication = authenticationManager.authenticate( new UsernamePasswordAuthenticationToken(loginDto.getEmail(), loginDto.getPassword()) 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; + } +} From 2aae88278c46cf937380317aae1f9d229bcb3c37 Mon Sep 17 00:00:00 2001 From: admin Date: Wed, 14 May 2025 13:36:29 +0900 Subject: [PATCH 5/5] =?UTF-8?q?=E7=BB=83=E4=B9=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/dogtestbyadmin/UserServiceTest.java | 66 +++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 src/test/java/co/jp/app/dogtestbyadmin/UserServiceTest.java 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{ + + } +}