From 07e0a59915c901195d2fea3e6fd7c6cdf4623cd3 Mon Sep 17 00:00:00 2001 From: admin Date: Thu, 8 May 2025 13:45:03 +0900 Subject: [PATCH 01/20] =?UTF-8?q?=E5=A2=9E=E5=8A=A0JWT=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E4=BE=9D=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 191 +++++++++++++++++++++++++++++++------------------------- 1 file changed, 106 insertions(+), 85 deletions(-) diff --git a/pom.xml b/pom.xml index 58faca1..5cf2dfb 100644 --- a/pom.xml +++ b/pom.xml @@ -1,91 +1,112 @@ - 4.0.0 - - org.springframework.boot - spring-boot-starter-parent - 3.4.5 - - - co.jp.app - dog-2 - 0.0.1-SNAPSHOT - dog-1 - dog introduce project for Spring Boot - - - - - - - - - - - - - - - 17 - - + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 3.4.5 + + + co.jp.app + dog-2 + 0.0.1-SNAPSHOT + dog-1 + dog introduce project for Spring Boot + + + + + + + + + + + + + + + 17 + + - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-data-jpa - - - com.mysql - mysql-connector-j - runtime - - - org.springframework.boot - spring-boot-starter-test - test - - - org.springframework.boot - spring-boot-starter-security - - - com.fasterxml.jackson.core - jackson-databind - - + + org.springframework.boot + spring-boot-starter-web + + + io.jsonwebtoken + jjwt-api + 0.11.5 + + + io.jsonwebtoken + jjwt-impl + 0.11.5 + runtime + + + io.jsonwebtoken + jjwt-jackson + 0.11.5 + runtime + + + org.springframework.boot + spring-boot-starter-data-jpa + + + com.mysql + mysql-connector-j + runtime + + + org.springframework.boot + spring-boot-starter-validation + + + org.springframework.boot + spring-boot-starter-test + test + + + org.springframework.boot + spring-boot-starter-security + + + com.fasterxml.jackson.core + jackson-databind + + - - - - org.apache.maven.plugins - maven-compiler-plugin - - - - org.projectlombok - lombok - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - org.projectlombok - lombok - - - - - - + + + + org.apache.maven.plugins + maven-compiler-plugin + + + + org.projectlombok + lombok + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + org.projectlombok + lombok + + + + + + \ No newline at end of file From ba2f3d6e88b0bf0b246ebc058c623852d08d7ce1 Mon Sep 17 00:00:00 2001 From: admin Date: Thu, 8 May 2025 15:48:59 +0900 Subject: [PATCH 02/20] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E9=80=9A=E7=94=A8?= =?UTF-8?q?=E5=93=8D=E5=BA=94=E7=B1=BB=E5=A4=84=E7=90=86=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E7=99=BB=E5=BD=95=E6=B3=A8=E5=86=8Cboolean=EF=BC=8Cmessage?= =?UTF-8?q?=EF=BC=8Cdata?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/co/jp/app/common/ApiResponse.java | 61 +++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 src/main/java/co/jp/app/common/ApiResponse.java diff --git a/src/main/java/co/jp/app/common/ApiResponse.java b/src/main/java/co/jp/app/common/ApiResponse.java new file mode 100644 index 0000000..33bbe4f --- /dev/null +++ b/src/main/java/co/jp/app/common/ApiResponse.java @@ -0,0 +1,61 @@ +package co.jp.app.common; + +import java.util.Objects; + +public class ApiResponse { + private boolean success; + private String message; + private T data; + + public static ApiResponse success(T data) { + + return new ApiResponse<>(true, null, data); + } + + public static ApiResponse fail(String message) { + + return new ApiResponse<>(false, message, null); + } + + public ApiResponse() { + } + + public ApiResponse(boolean success, String message, T data) { + this.success = success; + this.message = message; + this.data = data; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public T getData() { + return data; + } + + public void setData(T data) { + this.data = data; + } + + @Override + public String toString() { + return "ApiResponse{" + + "success=" + success + + ", message='" + message + '\'' + + ", data=" + data + + '}'; + } +} From 44d934bc1cd8f991cab28177c922596ffd5b7dac Mon Sep 17 00:00:00 2001 From: admin Date: Thu, 8 May 2025 15:49:20 +0900 Subject: [PATCH 03/20] =?UTF-8?q?=E5=A2=9E=E5=8A=A0jwt=E5=AF=86=E9=92=A5?= =?UTF-8?q?=E5=92=8C=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application.properties | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index e435626..618861c 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -7,4 +7,7 @@ spring.jpa.database-platform=org.hibernate.dialect.MySQLDialect spring.datasource.url=jdbc:mysql://192.168.1.192:3306/dog spring.datasource.username=coder spring.datasource.password=coder -spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver \ No newline at end of file +spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver + +jwt.secret=wM7Pz4BxvZ5NcLaBpgJm0eRQ5ztc3W5+OPH0E7g3gcQ= +jwt.token-expiration-ms==900000 \ No newline at end of file From 6e71978a77a6968c20be3de6493cf6ff4bfefe60 Mon Sep 17 00:00:00 2001 From: admin Date: Thu, 8 May 2025 15:49:51 +0900 Subject: [PATCH 04/20] =?UTF-8?q?=E6=96=87=E4=BB=B6=E5=90=8D=E6=9B=B4?= =?UTF-8?q?=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../co/jp/app/repository/erraRepository.class | Bin 715 -> 715 bytes .../classes/co/jp/app/service/erraService.class | Bin 745 -> 752 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/target/classes/co/jp/app/repository/erraRepository.class b/target/classes/co/jp/app/repository/erraRepository.class index 5e92a19616b22bc0a9b903ef40ffc9a466cc6bfc..59125c6f9a906834f9095e4b23a9c2ee762d18f8 100644 GIT binary patch delta 24 gcmX@jdYW~DKBMbIgIkQQo4Fa)7#UqB8!^oU0AeHu6951J delta 24 gcmX@jdYW~DK4a=cgIkQLo4Fa)7#UM18!^oU0A^$da{vGU diff --git a/target/classes/co/jp/app/service/erraService.class b/target/classes/co/jp/app/service/erraService.class index 0ff8c60e60348ec8b3d425fc1e3c2eafd73de127..8d2358caca184255904f8ddce3fd1bf3f417946d 100644 GIT binary patch delta 61 zcmaFK`hj&qw2W&}QDSgvQCVhkDkB45Dv%eHT999yS(0B=Ik7;J(RE^%F_74Im(g|d O97cCW*Ue8DSs4Mt_Z9#E delta 58 zcmeys`jT}*v}9^gQDSgvQCVhkDkB3si06`+&&Z(aGjY8rW9r0-#z5leUB=YOiy7S+ LQ#Ze6WMu>ZWq=ej From ab8f36d0004ccd03a6c2439ea3d94752f0d34219 Mon Sep 17 00:00:00 2001 From: admin Date: Thu, 8 May 2025 15:50:04 +0900 Subject: [PATCH 05/20] =?UTF-8?q?=E6=96=87=E4=BB=B6=E5=90=8D=E6=9B=B4?= =?UTF-8?q?=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/{ErraRepository.java => ErrRepository.java} | 3 ++- src/main/java/co/jp/app/service/ErraService.java | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) rename src/main/java/co/jp/app/repository/{ErraRepository.java => ErrRepository.java} (77%) diff --git a/src/main/java/co/jp/app/repository/ErraRepository.java b/src/main/java/co/jp/app/repository/ErrRepository.java similarity index 77% rename from src/main/java/co/jp/app/repository/ErraRepository.java rename to src/main/java/co/jp/app/repository/ErrRepository.java index 18dc5ee..336cea5 100644 --- a/src/main/java/co/jp/app/repository/ErraRepository.java +++ b/src/main/java/co/jp/app/repository/ErrRepository.java @@ -7,9 +7,10 @@ import org.springframework.data.repository.query.Param; import co.jp.app.entity.ErrorEntity; -public interface ErraRepository extends JpaRepository{ +public interface ErrRepository extends JpaRepository{ public default ErrorEntity getById(@Param("id") int id) { + return getById(id); } } \ No newline at end of file diff --git a/src/main/java/co/jp/app/service/ErraService.java b/src/main/java/co/jp/app/service/ErraService.java index 239ab18..1d3f019 100644 --- a/src/main/java/co/jp/app/service/ErraService.java +++ b/src/main/java/co/jp/app/service/ErraService.java @@ -4,14 +4,14 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import co.jp.app.entity.ErrorEntity; -import co.jp.app.repository.ErraRepository; +import co.jp.app.repository.ErrRepository; @Service public class ErraService { @Autowired -ErraRepository erraRepository; +ErrRepository erraRepository; public ErrorEntity getStatusById(int id) { return erraRepository.getById(id); From 3c4397f4307d2e3bc17e55121b5f297174a4e25c Mon Sep 17 00:00:00 2001 From: admin Date: Thu, 8 May 2025 15:51:59 +0900 Subject: [PATCH 06/20] =?UTF-8?q?=E9=87=8D=E5=86=99controller=EF=BC=8C?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BA=86=E7=94=A8=E6=88=B7=E6=B3=A8=E5=86=8C?= =?UTF-8?q?=E5=92=8C=E7=99=BB=E5=BD=95=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../co/jp/app/controller/UserController.java | 81 +++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 src/main/java/co/jp/app/controller/UserController.java diff --git a/src/main/java/co/jp/app/controller/UserController.java b/src/main/java/co/jp/app/controller/UserController.java new file mode 100644 index 0000000..1d8ed10 --- /dev/null +++ b/src/main/java/co/jp/app/controller/UserController.java @@ -0,0 +1,81 @@ +package co.jp.app.controller; + +import co.jp.app.common.ApiResponse; +import co.jp.app.dto.LoginDto; +import co.jp.app.dto.RegistrationDto; +import co.jp.app.service.JwtService; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.authentication.BadCredentialsException; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.web.bind.annotation.*; + +import co.jp.app.entity.ErrorEntity; +import co.jp.app.entity.UserEntity; +import co.jp.app.service.ErraService; +import co.jp.app.service.UserService; + +import java.util.HashMap; +import java.util.Map; + + +@CrossOrigin("http://192.168.1.50:5173") +@RestController +@RequestMapping("/api/user") +public class UserController { + + private final UserService userService; + private final AuthenticationManager authenticationManager; + private final JwtService jwtService; + + @Autowired + public UserController(UserService userService, AuthenticationManager authenticationManager, JwtService jwtService) { + this.userService = userService; + this.authenticationManager = authenticationManager; + this.jwtService = jwtService; + } + + @PostMapping("/register") + public ResponseEntity registerUser(@Valid @RequestBody RegistrationDto registrationDto) { + try { + + 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("ユーザー登録失敗しました。")); + } + } + + @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); // 生成单一的Token + + Map tokenResponse = new HashMap<>(); + tokenResponse.put("token", jwtToken); + + return ResponseEntity.ok(ApiResponse.success(tokenResponse)); + + } catch (BadCredentialsException e) { + + return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body(ApiResponse.fail("メールアドレスまたはパスワードが間違っています。")); + } catch (Exception e) { + + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(ApiResponse.fail("サーバーエラー。")); + } + } +} From f6ee15f4f91820f4005165068e118b2c789c825e Mon Sep 17 00:00:00 2001 From: admin Date: Thu, 8 May 2025 15:52:51 +0900 Subject: [PATCH 07/20] =?UTF-8?q?=E5=A2=9E=E5=8A=A0securityconfig?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/config/security/SecurityConfig.java | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 src/main/java/co/jp/app/config/security/SecurityConfig.java diff --git a/src/main/java/co/jp/app/config/security/SecurityConfig.java b/src/main/java/co/jp/app/config/security/SecurityConfig.java new file mode 100644 index 0000000..745c17d --- /dev/null +++ b/src/main/java/co/jp/app/config/security/SecurityConfig.java @@ -0,0 +1,60 @@ +package co.jp.app.config.security; + +import co.jp.app.config.security.filter.JwtAuthenticationFilter; +import co.jp.app.service.UserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.authentication.AuthenticationProvider; +import org.springframework.security.authentication.dao.DaoAuthenticationProvider; +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.configurers.AbstractHttpConfigurer; +import org.springframework.security.config.http.SessionCreationPolicy; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.web.SecurityFilterChain; +import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; + +@Configuration +public class SecurityConfig { + + @Autowired + private JwtAuthenticationFilter jwtAuthenticationFilter; + + @Autowired + private UserService userService; + + @Bean + public PasswordEncoder passwordEncoder() { + return new BCryptPasswordEncoder(); + } + + @Bean + public AuthenticationProvider authenticationProvider() { + DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider(); + authProvider.setUserDetailsService(userService); + authProvider.setPasswordEncoder(passwordEncoder()); + return authProvider; + } + + @Bean + public AuthenticationManager authenticationManager(AuthenticationConfiguration authenticationConfiguration) throws Exception { + 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(); + } +} From 779d94ba1b7d4d2cab40bf9d72dc85a17e478a65 Mon Sep 17 00:00:00 2001 From: admin Date: Thu, 8 May 2025 15:53:09 +0900 Subject: [PATCH 08/20] =?UTF-8?q?=E5=A2=9E=E5=8A=A0jwtservice?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/co/jp/app/service/JwtService.java | 102 ++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 src/main/java/co/jp/app/service/JwtService.java diff --git a/src/main/java/co/jp/app/service/JwtService.java b/src/main/java/co/jp/app/service/JwtService.java new file mode 100644 index 0000000..ff0cd74 --- /dev/null +++ b/src/main/java/co/jp/app/service/JwtService.java @@ -0,0 +1,102 @@ +package co.jp.app.service; + +import io.jsonwebtoken.*; +import io.jsonwebtoken.security.Keys; +import java.util.function.Function; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.stereotype.Service; + +import java.security.Key; +import java.util.Base64; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +@Service +public class JwtService { + + private static final Logger logger = LoggerFactory.getLogger(JwtService.class); + //log + + @Value("${jwt.secret}") + private String secretKey; + + @Value("${jwt.token-expiration-ms}") + private long tokenExpirationMs; + + private Key getSignKey() { + byte[] keyBytes = Base64.getDecoder().decode(secretKey); + return Keys.hmacShaKeyFor(keyBytes); + } + + public String extractUsername(String token) { + try { + return extractClaim(token, Claims::getSubject); + } catch (ExpiredJwtException e) { + logger.warn("JWT token is expired when extracting username: {}", e.getMessage()); + return e.getClaims().getSubject(); + } catch (MalformedJwtException | SignatureException | UnsupportedJwtException | IllegalArgumentException e) { + logger.error("Invalid JWT token when extracting username: {}", e.getMessage()); + return null; + } + } + + public T extractClaim(String token, Function claimsResolver) { + final Claims claims = extractAllClaims(token); + return claimsResolver.apply(claims); + } + + private Claims extractAllClaims(String token) { + return Jwts + .parserBuilder() + .setSigningKey(getSignKey()) + .build() + .parseClaimsJws(token) + .getBody(); + } + + public String generateToken(UserDetails userDetails) { + Map claims = new HashMap<>(); + return createToken(claims, userDetails.getUsername()); + } + + private String createToken(Map claims, String subject) { + return Jwts.builder() + .setClaims(claims) + .setSubject(subject) + .setIssuedAt(new Date(System.currentTimeMillis())) + .setExpiration(new Date(System.currentTimeMillis() + tokenExpirationMs)) // 使用配置的过期时间 + .signWith(getSignKey(), SignatureAlgorithm.HS256) + .compact(); + } + + public boolean isTokenValid(String token, UserDetails userDetails) { + try { + final String username = extractUsername(token); + if (username == null) { + return false; + } + + return (username.equals(userDetails.getUsername()) && !isTokenActuallyExpired(token)); + } catch (ExpiredJwtException e) { + logger.warn("Token validation failed: Expired JWT - {}", e.getMessage()); + return false; + } catch (MalformedJwtException | SignatureException | UnsupportedJwtException | IllegalArgumentException e) { + // 这些是更严重的token结构或签名问题 + logger.error("Token validation failed: Invalid JWT (format, signature, etc.) - {}", e.getMessage()); + return false; + } + } + + private boolean isTokenActuallyExpired(String token) { + return extractExpiration(token).before(new Date()); + } + + private Date extractExpiration(String token) { + return extractClaim(token, Claims::getExpiration); + } +} From 37a8ea12c4b9d55178f3d222065fd95f0678d50a Mon Sep 17 00:00:00 2001 From: admin Date: Thu, 8 May 2025 15:53:21 +0900 Subject: [PATCH 09/20] =?UTF-8?q?=E5=A2=9E=E5=8A=A0jwtfilter?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../filter/JwtAuthenticationFilter.java | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 src/main/java/co/jp/app/config/security/filter/JwtAuthenticationFilter.java 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 new file mode 100644 index 0000000..e512fc0 --- /dev/null +++ b/src/main/java/co/jp/app/config/security/filter/JwtAuthenticationFilter.java @@ -0,0 +1,58 @@ +package co.jp.app.config.security.filter; + +import co.jp.app.service.UserService; +import co.jp.app.service.JwtService; +import java.io.IOException; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.lang.NonNull; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.web.authentication.WebAuthenticationDetailsSource; +import org.springframework.stereotype.Component; +import org.springframework.web.filter.OncePerRequestFilter; + + +@Component +public class JwtAuthenticationFilter extends OncePerRequestFilter { + + @Autowired + private JwtService jwtService; + + @Autowired + private UserService userService; + + @Override + protected void doFilterInternal(@NonNull HttpServletRequest request, @NonNull HttpServletResponse response, @NonNull FilterChain filterChain) + throws ServletException, IOException { + + final String authHeader = request.getHeader("Authorization"); + final String jwt; + final String username; + + if (authHeader == null || !authHeader.startsWith("Bearer ")) { + filterChain.doFilter(request, response); + return; + } + + jwt = authHeader.substring(7); + username = jwtService.extractUsername(jwt); + + if (username != null && SecurityContextHolder.getContext().getAuthentication() == null) { + UserDetails userDetails = this.userService.loadUserByUsername(username); + if (jwtService.isTokenValid(jwt, userDetails)) { + UsernamePasswordAuthenticationToken authToken = + new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities()); + + authToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request)); + SecurityContextHolder.getContext().setAuthentication(authToken); + } + } + + filterChain.doFilter(request, response); + } +} \ No newline at end of file From 75103a3a8a8153146ee2a3565ac98b6c757f67cb Mon Sep 17 00:00:00 2001 From: admin Date: Thu, 8 May 2025 15:54:09 +0900 Subject: [PATCH 10/20] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=B3=A8=E5=86=8C?= =?UTF-8?q?=E5=92=8C=E7=99=BB=E5=BD=95=E7=9A=84=E6=95=B0=E6=8D=AE=E4=BC=A0?= =?UTF-8?q?=E8=BE=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/co/jp/app/dto/LoginDto.java | 24 +++++++++++++ .../java/co/jp/app/dto/RegistrationDto.java | 34 +++++++++++++++++++ 2 files changed, 58 insertions(+) create mode 100644 src/main/java/co/jp/app/dto/LoginDto.java create mode 100644 src/main/java/co/jp/app/dto/RegistrationDto.java diff --git a/src/main/java/co/jp/app/dto/LoginDto.java b/src/main/java/co/jp/app/dto/LoginDto.java new file mode 100644 index 0000000..d288aa1 --- /dev/null +++ b/src/main/java/co/jp/app/dto/LoginDto.java @@ -0,0 +1,24 @@ +package co.jp.app.dto; + +public class LoginDto { + + private String email; + + private String password; + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } +} diff --git a/src/main/java/co/jp/app/dto/RegistrationDto.java b/src/main/java/co/jp/app/dto/RegistrationDto.java new file mode 100644 index 0000000..e93533f --- /dev/null +++ b/src/main/java/co/jp/app/dto/RegistrationDto.java @@ -0,0 +1,34 @@ +package co.jp.app.dto; + +public class RegistrationDto { + + private String name; + + private String email; + + private String password; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } +} From 225e89df5d77eabd5bc874b92b4a930100115e73 Mon Sep 17 00:00:00 2001 From: admin Date: Thu, 8 May 2025 15:54:59 +0900 Subject: [PATCH 11/20] =?UTF-8?q?=E9=87=8D=E5=A4=A7=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/co/jp/app/config/SecurityConfig.java | 15 --- .../co/jp/app/controller/LoginController.java | 37 -------- .../java/co/jp/app/service/UploadService.java | 23 ----- .../java/co/jp/app/service/UserService.java | 86 +++++++++++------- .../jp/app/controller/loginController.class | Bin 1617 -> 1204 bytes .../jp/app/controller/uploadController.class | Bin 1109 -> 1109 bytes .../classes/co/jp/app/entity/UserEntity.class | Bin 1400 -> 1499 bytes .../jp/app/repository/uploadRepository.class | Bin 916 -> 916 bytes .../co/jp/app/repository/userRepository.class | Bin 884 -> 667 bytes .../co/jp/app/service/uploadService.class | Bin 988 -> 988 bytes .../co/jp/app/service/userService.class | Bin 922 -> 1640 bytes 11 files changed, 54 insertions(+), 107 deletions(-) delete mode 100644 src/main/java/co/jp/app/config/SecurityConfig.java delete mode 100644 src/main/java/co/jp/app/controller/LoginController.java delete mode 100644 src/main/java/co/jp/app/service/UploadService.java diff --git a/src/main/java/co/jp/app/config/SecurityConfig.java b/src/main/java/co/jp/app/config/SecurityConfig.java deleted file mode 100644 index 5a7fcb2..0000000 --- a/src/main/java/co/jp/app/config/SecurityConfig.java +++ /dev/null @@ -1,15 +0,0 @@ -package co.jp.app.config; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; -import org.springframework.security.crypto.password.PasswordEncoder; - -@Configuration -public class SecurityConfig { - - @Bean - public PasswordEncoder passwordEncoder() { - return new BCryptPasswordEncoder(); - } -} diff --git a/src/main/java/co/jp/app/controller/LoginController.java b/src/main/java/co/jp/app/controller/LoginController.java deleted file mode 100644 index c54bcbd..0000000 --- a/src/main/java/co/jp/app/controller/LoginController.java +++ /dev/null @@ -1,37 +0,0 @@ -package co.jp.app.controller; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.CrossOrigin; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RestController; - -import co.jp.app.entity.ErrorEntity; -import co.jp.app.entity.UserEntity; -import co.jp.app.service.ErraService; -import co.jp.app.service.UserService; - - -@CrossOrigin("http://192.168.1.50:5173") -@RestController("/api/login") -public class LoginController { - - @Autowired - private UserService userService; - - @Autowired - private ErraService erraService; - - @GetMapping("/status") - public String getStatusByNameOrEmail() { - String input="aaa"; - - if (userByName == null && userByEmail == null) { - return "全項目に入力してください"; - } - - // 如果有找到,就固定使用 ID 1001 去查 erraEntity - ErrorEntity erra = erraService.getStatusById(1001); - - return erra.getStatus(); - } -} diff --git a/src/main/java/co/jp/app/service/UploadService.java b/src/main/java/co/jp/app/service/UploadService.java deleted file mode 100644 index d1fd207..0000000 --- a/src/main/java/co/jp/app/service/UploadService.java +++ /dev/null @@ -1,23 +0,0 @@ -package co.jp.app.service; - -import java.util.List; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import co.jp.app.entity.PetEntity; -import co.jp.app.repository.UploadRepository; - -@Service -public class UploadService { - - @Autowired - private UploadRepository uploadDao; - - public List saveAll(Iterable entities) { - - return uploadDao.saveAll(entities); - - } - -} diff --git a/src/main/java/co/jp/app/service/UserService.java b/src/main/java/co/jp/app/service/UserService.java index 78d0d25..c024fb9 100644 --- a/src/main/java/co/jp/app/service/UserService.java +++ b/src/main/java/co/jp/app/service/UserService.java @@ -1,52 +1,74 @@ package co.jp.app.service; -import jakarta.transaction.Transactional; +import java.util.Collection; +import java.util.Collections; +import java.util.List; + +import co.jp.app.dto.RegistrationDto; +import co.jp.app.entity.UserEntity; +import co.jp.app.repository.UserRepository; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.userdetails.User; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; -import co.jp.app.entity.UserEntity; -import co.jp.app.repository.UserRepository; - +import co.jp.app.entity.PetEntity; +import co.jp.app.repository.UploadRepository; +import org.springframework.transaction.annotation.Transactional; @Service -public class UserService { +public class UserService implements UserDetailsService { - private final UserRepository userEntityRepository; + private final UserRepository userRepository; + private final PasswordEncoder passwordEncoder; @Autowired - public UserService(UserRepository userEntityRepository, PasswordEncoder passwordEncoder ) { - this.userEntityRepository = userEntityRepository; + public UserService(UserRepository userRepository, PasswordEncoder passwordEncoder) { + this.userRepository = userRepository; this.passwordEncoder = passwordEncoder; } - @Transactional // 整个注册过程应该是一个事务 - public UserEntity registerNewUser(String name, String email, String rawPassword) throws Exception { - // 1. 检查邮箱是否已被注册 - if (userEntityRepository.existsByEmail(email)) { - throw new Exception("错误:该邮箱地址已被注册!"); // 或者自定义异常 + @Transactional + public UserEntity registerNewUser(RegistrationDto registrationDto) throws Exception { + + if (userRepository.existsByEmail(registrationDto.getEmail())) { + throw new Exception("错误:邮箱 " + registrationDto.getEmail() + " 已被注册!"); } - // (可选) 检查用户名是否已被注册 (如果您有用户名字段) - // if (userEntityRepository.existsByUsername(username)) { - // throw new Exception("错误:该用户名已被注册!"); - // } - - // 2. 创建新的 UserEntity 对象 UserEntity newUser = new UserEntity(); - newUser.setName(name); - newUser.setEmail(email); + newUser.setName(registrationDto.getName()); + newUser.setEmail(registrationDto.getEmail()); + newUser.setPassword(passwordEncoder.encode(registrationDto.getPassword())); - // 3. 对密码进行哈希加密 (非常重要!) - // String hashedPassword = passwordEncoder.encode(rawPassword); - // newUser.setPassword(hashedPassword); - newUser.setPassword(rawPassword); // 实际项目中必须加密!这里为了简化先直接赋值 - - // 4. 设置其他默认属性,例如账户状态、角色等 (如果需要) - // newUser.setActive(true); - // newUser.setRoles(...); - - // 5. 保存新用户到数据库 - return userEntityRepository.save(newUser); + return userRepository.save(newUser); } + + @Override + @Transactional(readOnly = true) + public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException { + UserEntity userEntity = userRepository.findByEmail(email) + .orElseThrow(() -> new UsernameNotFoundException("未找到邮箱为: " + email + " 的用户")); + + Collection authorities = Collections.singletonList(new SimpleGrantedAuthority("ROLE_USER")); // 示例:给所有用户一个ROLE_USER权限 + + return new User( + userEntity.getEmail(), + userEntity.getPassword(), + true, // enabled + true, // accountNonExpired + true, // credentialsNonExpired + true, // accountNonLocked + authorities // 用户的权限集合 + ); + } + + public boolean checkPassword(UserEntity user, String rawPassword) { + return passwordEncoder.matches(rawPassword, user.getPassword()); + } + } diff --git a/target/classes/co/jp/app/controller/loginController.class b/target/classes/co/jp/app/controller/loginController.class index 44f94d42c7f91c740c069bb7e0fa0e83cce40cf4..aaa222a612694dc34cffd7bf8cba2e117385c0fb 100644 GIT binary patch delta 386 zcmcb}vxSrE)W2Q(7#J9A8H^@!#q#^)r)TCl=jW9a<>%z27ER7#RAF%~DoUIJ(-p< z`b_@7baV7=@Ajt<-BLyTCfox^4nF?^4Up3{fmkb=fw7oD8z`y+HdPlaD-PuA!DaOsI1E6XVg^G1dN?*4 delta 780 zcmaJ;OKTHR7(I8AcFZ_^SWNm#Vr!GONmIu@e6+DzQ)4%2H_?TNi!lr#b(+M<7zij~ zz<{`sFo;M&3Ze*tWKptE=(gz2U*KX0(zW~IH`8drf-v`swx`8$wwtct3L_29efk5+L%_faxSAV^kfx%UEWj@m1JJe z=@o{V$<&5imL*lrXQi~R-m;tyt0hY+B}P z?hdK>#eJFSLN^$q^md(uQ-qvt{@58qhZ7Mqf4F?r>2^G5>gR}y6c37!aGsFf4-u*p zBiv%C+A_aM3;JZX(p6EEnufLGZK> z(O-Z%1>vn?gy<;kVQMnrNSHrt)0W^OoW&eT5iyQ=Tp$@<%DG6)MLC_ggv)SafeOQXBhTSuF|@87p#P3%DzsK91_m$KtIuyzt=aAw0Q|Pe*=N`w9Ehi diff --git a/target/classes/co/jp/app/controller/uploadController.class b/target/classes/co/jp/app/controller/uploadController.class index 936a46c204abcf1f745af8b8f09ab606760e49d4..e076c44069ae61ca3b7420adf2bf7793152c8a9a 100644 GIT binary patch delta 34 ncmcc0ag}324P)rUT74j~7DU|rz!*CD9OFC2(9L_9W-tN(@f8i& delta 34 ncmcc0ag}324P)uVT74j~7DU|rz*su@9OFC2(#?CBW-tN(`;`uO diff --git a/target/classes/co/jp/app/entity/UserEntity.class b/target/classes/co/jp/app/entity/UserEntity.class index 814609f21e12a325ca1e51d952854f2baf55a983..9864bfea70ebe5cfdbce217878ceb7bb9cff1d68 100644 GIT binary patch literal 1499 zcmaizZBG+H5XWarAAlCiV+8>f1#Ce$5y2NIi9s|?5Q)?#@@{E2W$}7f@Afo&CtqkH zG4X{Tzz=2o&s_uNxaymoo1NMJ{&r^W*Y6)ciRdXk9;6iYY3xXMjGupzMy&NzL%bnR!4ch_Kk8H%6h3BKOb!i7`3u?Y$zjgMX z6A-PPb;1+X=ezs0YVDn%$;3OVP3X=fhIU*#XgdgJ14n-dR39oY0O16-E%5^O38mR_ zn4Z^xp_pl==KrBQao?nXg-XJC@=sAzX;Yl5Lt&6u$iUrB)*2Kcd_!{L^J`I z63yd_agam{vMU|Q_K#BCAO zWh#bD4-%P1;!Kr9rnO|IkvP)|m{xl*MI+K>8Vi{oCNho3nbs1S){~jW<4hZ1+U&s; V4Q7|A6t?G4xNd|a&!e+R^apQ~^1T26 literal 1400 zcmah|T~8B16g^W~3T3f?fPAVTXj_C8d_+l%pxLA%k=n$^p`Db$cDLD`YWPn+Xd*H3 z!5`p{GM-tmm9pr|y>n;IJ#+TV-Jid{{{Zk5k8?<2Ad9qv3M({doJG#T2poa=THv0vUDA8{3xVhJ(E2$f%aoO}jJhU;;M!e(SaWctnjM$GBna{t1!}$QGQLiFO{!CX;i%`n;o@Hw#eAJar&PQl2%UJ zafi3Nw_oup?*wKN@9^s6O+OFn{NQ|9`)a?_I#OXpQlhmWsL5tkhT7H_n`v{bsd=&d z4--k6Z78!J8#!4hUbT{d=nr73aP_=c<*U9@<~XPy$dEjS&d>s~?pfol8{K7wyViU@ zwa1s?fvwU7&$6U6*CRw6bl+lxh+dUD3_4*=z0mfP^Sw#fu z^f~I{dMnL-m%x3ZGBlb=;6b9M(SA*fiJA(@nnwFIEm70*HJYr)T}}B|QxT;EpT<7% z@Nb`16E&^jAyJoonm@x>zosHJm9EjW9*@U`PwTO!jYOX&`+ZtZ)Z`}nG}*6dlbW`! X(PU?^>(g{>#iKZG#&c}vZVUJgE$`j| diff --git a/target/classes/co/jp/app/repository/uploadRepository.class b/target/classes/co/jp/app/repository/uploadRepository.class index 562f6ae9e575b8e9a942159be16b69e618d2ddca..dde1f62bb2af4c6ea6f96ce1273d59670792e44a 100644 GIT binary patch delta 24 gcmbQjK81aPK4a)agNKZvn}rxBGctxwUdHqe0APCv9RL6T delta 24 gcmbQjK81aPK4a-bgNKZzn}rxBGcuM=UdHqe0A#xeeEp^UR^ z!mbH1#zWK2r1QSD^ZqaBby|z<+=g@ZMW&q0!Y9sM1 zcq~-J+r1I?eE=&AjSipCEPSXPNtF~z}C&?=ztV6A8o<=#ogWx{4=nVp4-zsf5d z`~m(bi?<5}YlV22>FM6yey?BmpTC#CiReA8E>J)-HL5hIO0$Aq^{pHxl9NO_mDp5! z>&7xml{>t31AIG~n6E57{i4sGUh#{2`Slb{B6 zF@VJi(hM!a+lC*&&b{5ZAQ8~7B4Y{nEb<6{G;yz7=g>oH!9zAJ(<6L;jCU27Fe^9> mf!GtArzv7k=zf^mBusM(OuG!zz6YiaX3r20=sCS8?8_^hkl{f9 diff --git a/target/classes/co/jp/app/service/uploadService.class b/target/classes/co/jp/app/service/uploadService.class index 354dca08cb150464e05d9609a22aad659afd3f63..8d714834cb936e2df039235b255e6066113df6f7 100644 GIT binary patch delta 35 ncmcb^eusTRG-K$*7(*b@X9^^aJYfvoypmCn5lHQ3Qe*@G>HiE2 delta 35 ncmcb^eusTRG-K(+7(*b@X9^^aJYg)|ypmCn5lHQ3Qe*@G^#2U3 diff --git a/target/classes/co/jp/app/service/userService.class b/target/classes/co/jp/app/service/userService.class index 9a0337a7eb38c363386371011b6935aed63c7e11..c5c1d660e895e88d3a76c9d84d52b0f1698e1ae5 100644 GIT binary patch literal 1640 zcmbtU&2JM&6#tFA$tI2sX+j822#|&ZI|&S5Z7GI;LFvh)5dll|HrY(VCeH3^cAVf_ z+e1%1_Cf`hN|h=h5k3>~A?UgPMA1V=uF}Z zbTJHlh7ChX-f}}7UaCwk3%A73lPNS(n$gPj7IN7iZ0up^Zfs26a%7-g-)qBOh9mEO zyS=rx_WtGXTWf#5`}zLc`wutoJlMSZPQk9WErebtVo8D=De$=%w?OXsHqs{GoMwAg0B{M7#RNM72%_>OH^~Gtf;o! zQI$aZJgDK}+rTD0$Dflbmn{;o%Oo=FF1VhYDlgAUbxq8cNYhpD9Z@O@<(hR(Y3ZA8 z$Z)U;+zuUCa6Ilc<)8aHOx6sdUS-=!PzV%zK`%g=rYt zJF{cFSt-1b&kM)2JQsBXo-b>E)m3uNfLC&X+EuD4xoR#B!}aF6)%vxmY#-HRn~3_L z%P5lNQ7(q-M$^}PF|^3)UFlF_b-QxZiQYD*flv5O&1m5)T@gX8c8U6RB6fx-;*wBW zaIJ_D;)7V@*BY`Y5xm5VUsjI%&NU6u+4P1SGk6&?J92E8lfJG5lGmP`90uuyiqYFf zxtceMq!`I97)2aow3;>#9?gl-4Y1L%r?4MJXU1vV743AvqKn;*9vmgzq3UTI1E&?) zMP6AX9mfgsc9P`w7^#8d^q-=?l|r7Tnc*vZP3}zKC*-Jw=KSar*yGQTis3d=FVKCX zt7ikfuV0|=#s>DEwbItuItJ3#_&N@yt)uH0G8Sp;8Af9G8+{MRNgM|60oXM5A%%YQ z;xJ(y#t41m6!0W{2LI`5&^rD+zQGv+MnLc_NrtOD&XN=-`$6PzjsTx0Z5*r@6C_x4 dygN!W6(?(u9mt}Q>IITxxEPK3Isun}{{Y)ayNmz; delta 499 zcmZ{gze>YU7{$*`jK#KUthTjPtJXhA9jZ7=5egL?6t$CMXfGOQjiiZ?L41aiL2&XB z6a>*hoP82UpFlh})*?ce@8ocQ_xC0FNZ!Wc?_V#k04iAR#*fl|N4j-mdE!a8BVdw?JinlTA(fX)>W=R= zp7IUfO)zWNEm`ei5CZoC;y3wX9jqS Sf4q4VNorV%=5qfxtN`ChE>a}` From 94308202e9e34cf60ceb0b16f33ab98897749b26 Mon Sep 17 00:00:00 2001 From: admin Date: Fri, 9 May 2025 13:54:12 +0900 Subject: [PATCH 12/20] =?UTF-8?q?=E5=A2=9E=E5=8A=A0CorsConfig=E5=A4=84?= =?UTF-8?q?=E7=90=86=E8=B7=A8=E5=9F=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/co/jp/app/controller/UserController.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/co/jp/app/controller/UserController.java b/src/main/java/co/jp/app/controller/UserController.java index 1d8ed10..51aea05 100644 --- a/src/main/java/co/jp/app/controller/UserController.java +++ b/src/main/java/co/jp/app/controller/UserController.java @@ -24,8 +24,6 @@ import co.jp.app.service.UserService; import java.util.HashMap; import java.util.Map; - -@CrossOrigin("http://192.168.1.50:5173") @RestController @RequestMapping("/api/user") public class UserController { From 203fc9866df5e1127e3d5674a5ac28d8b716c6c1 Mon Sep 17 00:00:00 2001 From: admin Date: Fri, 9 May 2025 13:55:03 +0900 Subject: [PATCH 13/20] =?UTF-8?q?=E5=A2=9E=E5=8A=A0CorsConfig=E5=A4=84?= =?UTF-8?q?=E7=90=86=E8=B7=A8=E5=9F=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/co/jp/app/config/CorsConfig.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 src/main/java/co/jp/app/config/CorsConfig.java diff --git a/src/main/java/co/jp/app/config/CorsConfig.java b/src/main/java/co/jp/app/config/CorsConfig.java new file mode 100644 index 0000000..a28c48b --- /dev/null +++ b/src/main/java/co/jp/app/config/CorsConfig.java @@ -0,0 +1,18 @@ +package co.jp.app.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.CorsRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +public class CorsConfig implements WebMvcConfigurer { + + @Override + public void addCorsMappings(CorsRegistry registry) { + registry.addMapping("/api/**") // 允许 /api/ 下的所有请求 + .allowedOrigins("http://192.168.1.50:5173") // 允许来自该域的请求 + .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") // 允许的 HTTP 方法 + .allowedHeaders("*") // 允许所有头部 + .allowCredentials(true); // 允许发送 Cookie + } +} From 6ff61fccfab5072e548d63fbe07c48c781f90f27 Mon Sep 17 00:00:00 2001 From: admin Date: Fri, 9 May 2025 14:42:29 +0900 Subject: [PATCH 14/20] =?UTF-8?q?=E4=BF=AE=E6=94=B9SignatureException?= =?UTF-8?q?=E4=BE=9D=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/co/jp/app/service/JwtService.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/co/jp/app/service/JwtService.java b/src/main/java/co/jp/app/service/JwtService.java index ff0cd74..60ff64f 100644 --- a/src/main/java/co/jp/app/service/JwtService.java +++ b/src/main/java/co/jp/app/service/JwtService.java @@ -2,6 +2,7 @@ package co.jp.app.service; import io.jsonwebtoken.*; import io.jsonwebtoken.security.Keys; +import io.jsonwebtoken.security.SignatureException; import java.util.function.Function; import org.slf4j.Logger; @@ -83,10 +84,11 @@ public class JwtService { return (username.equals(userDetails.getUsername()) && !isTokenActuallyExpired(token)); } catch (ExpiredJwtException e) { + logger.warn("Token validation failed: Expired JWT - {}", e.getMessage()); return false; } catch (MalformedJwtException | SignatureException | UnsupportedJwtException | IllegalArgumentException e) { - // 这些是更严重的token结构或签名问题 + logger.error("Token validation failed: Invalid JWT (format, signature, etc.) - {}", e.getMessage()); return false; } From 53a484dd2bd61d7ebdd76b9a21141961652e163d Mon Sep 17 00:00:00 2001 From: admin Date: Fri, 9 May 2025 14:54:44 +0900 Subject: [PATCH 15/20] =?UTF-8?q?=E5=A2=9E=E5=8A=A0jetbrains.annotations.N?= =?UTF-8?q?otNull=E4=BE=9D=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/pom.xml b/pom.xml index 5cf2dfb..b3d201c 100644 --- a/pom.xml +++ b/pom.xml @@ -78,6 +78,12 @@ com.fasterxml.jackson.core jackson-databind + + org.jetbrains + annotations + 13.0 + compile + From 320a344c04bdeec9e3f5213ba33021f37194555f Mon Sep 17 00:00:00 2001 From: admin Date: Fri, 9 May 2025 14:55:25 +0900 Subject: [PATCH 16/20] =?UTF-8?q?=E5=A2=9E=E5=8A=A0jetbrains.annotations.N?= =?UTF-8?q?otNull=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/co/jp/app/service/JwtService.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/co/jp/app/service/JwtService.java b/src/main/java/co/jp/app/service/JwtService.java index 60ff64f..8f68ae2 100644 --- a/src/main/java/co/jp/app/service/JwtService.java +++ b/src/main/java/co/jp/app/service/JwtService.java @@ -5,6 +5,7 @@ import io.jsonwebtoken.security.Keys; import io.jsonwebtoken.security.SignatureException; import java.util.function.Function; +import org.jetbrains.annotations.NotNull; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; @@ -29,6 +30,7 @@ public class JwtService { @Value("${jwt.token-expiration-ms}") private long tokenExpirationMs; + @org.jetbrains.annotations.NotNull private Key getSignKey() { byte[] keyBytes = Base64.getDecoder().decode(secretKey); return Keys.hmacShaKeyFor(keyBytes); @@ -46,7 +48,7 @@ public class JwtService { } } - public T extractClaim(String token, Function claimsResolver) { + public T extractClaim(String token, @NotNull Function claimsResolver) { final Claims claims = extractAllClaims(token); return claimsResolver.apply(claims); } @@ -60,7 +62,7 @@ public class JwtService { .getBody(); } - public String generateToken(UserDetails userDetails) { + public String generateToken(@NotNull UserDetails userDetails) { Map claims = new HashMap<>(); return createToken(claims, userDetails.getUsername()); } From f335896f4fd908f2d09aea972b9135c7f1abecc9 Mon Sep 17 00:00:00 2001 From: admin Date: Fri, 9 May 2025 15:35:13 +0900 Subject: [PATCH 17/20] =?UTF-8?q?=E7=A7=BB=E9=99=A4autowired?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../co/jp/app/config/security/SecurityConfig.java | 11 ++++++----- .../security/filter/JwtAuthenticationFilter.java | 11 ++++++----- .../java/co/jp/app/controller/UserController.java | 2 -- src/main/java/co/jp/app/service/UserService.java | 14 ++++---------- 4 files changed, 16 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 745c17d..85642a6 100644 --- a/src/main/java/co/jp/app/config/security/SecurityConfig.java +++ b/src/main/java/co/jp/app/config/security/SecurityConfig.java @@ -2,7 +2,6 @@ package co.jp.app.config.security; import co.jp.app.config.security.filter.JwtAuthenticationFilter; import co.jp.app.service.UserService; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.authentication.AuthenticationManager; @@ -20,11 +19,13 @@ import org.springframework.security.web.authentication.UsernamePasswordAuthentic @Configuration public class SecurityConfig { - @Autowired - private JwtAuthenticationFilter jwtAuthenticationFilter; + private final JwtAuthenticationFilter jwtAuthenticationFilter; + private final UserService userService; - @Autowired - private UserService userService; + public SecurityConfig(JwtAuthenticationFilter jwtAuthenticationFilter, UserService userService) { + this.jwtAuthenticationFilter = jwtAuthenticationFilter; + this.userService = userService; + } @Bean public PasswordEncoder passwordEncoder() { 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 e512fc0..b2e857f 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 @@ -7,7 +7,6 @@ import jakarta.servlet.FilterChain; import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.lang.NonNull; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.context.SecurityContextHolder; @@ -20,11 +19,13 @@ import org.springframework.web.filter.OncePerRequestFilter; @Component public class JwtAuthenticationFilter extends OncePerRequestFilter { - @Autowired - private JwtService jwtService; + private final JwtService jwtService; + private final UserService userService; - @Autowired - private UserService userService; + public JwtAuthenticationFilter(JwtService jwtService, UserService userService) { + this.jwtService = jwtService; + this.userService = userService; + } @Override protected void doFilterInternal(@NonNull HttpServletRequest request, @NonNull HttpServletResponse response, @NonNull FilterChain filterChain) diff --git a/src/main/java/co/jp/app/controller/UserController.java b/src/main/java/co/jp/app/controller/UserController.java index 51aea05..803c305 100644 --- a/src/main/java/co/jp/app/controller/UserController.java +++ b/src/main/java/co/jp/app/controller/UserController.java @@ -5,7 +5,6 @@ import co.jp.app.dto.LoginDto; import co.jp.app.dto.RegistrationDto; import co.jp.app.service.JwtService; import jakarta.validation.Valid; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.security.authentication.AuthenticationManager; @@ -32,7 +31,6 @@ public class UserController { private final AuthenticationManager authenticationManager; private final JwtService jwtService; - @Autowired public UserController(UserService userService, AuthenticationManager authenticationManager, JwtService jwtService) { this.userService = userService; this.authenticationManager = authenticationManager; diff --git a/src/main/java/co/jp/app/service/UserService.java b/src/main/java/co/jp/app/service/UserService.java index c024fb9..21d2db1 100644 --- a/src/main/java/co/jp/app/service/UserService.java +++ b/src/main/java/co/jp/app/service/UserService.java @@ -7,7 +7,7 @@ import java.util.List; import co.jp.app.dto.RegistrationDto; import co.jp.app.entity.UserEntity; import co.jp.app.repository.UserRepository; -import org.springframework.beans.factory.annotation.Autowired; +import org.jetbrains.annotations.NotNull; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.userdetails.User; @@ -27,17 +27,16 @@ public class UserService implements UserDetailsService { private final UserRepository userRepository; private final PasswordEncoder passwordEncoder; - @Autowired public UserService(UserRepository userRepository, PasswordEncoder passwordEncoder) { this.userRepository = userRepository; this.passwordEncoder = passwordEncoder; } @Transactional - public UserEntity registerNewUser(RegistrationDto registrationDto) throws Exception { + public UserEntity registerNewUser(@NotNull RegistrationDto registrationDto) throws Exception { if (userRepository.existsByEmail(registrationDto.getEmail())) { - throw new Exception("错误:邮箱 " + registrationDto.getEmail() + " 已被注册!"); + throw new Exception("エラー:メール:" + registrationDto.getEmail() + " はすでに登録されました。"); } UserEntity newUser = new UserEntity(); @@ -52,7 +51,7 @@ public class UserService implements UserDetailsService { @Transactional(readOnly = true) public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException { UserEntity userEntity = userRepository.findByEmail(email) - .orElseThrow(() -> new UsernameNotFoundException("未找到邮箱为: " + email + " 的用户")); + .orElseThrow(() -> new UsernameNotFoundException(email + " not found")); Collection authorities = Collections.singletonList(new SimpleGrantedAuthority("ROLE_USER")); // 示例:给所有用户一个ROLE_USER权限 @@ -66,9 +65,4 @@ public class UserService implements UserDetailsService { authorities // 用户的权限集合 ); } - - public boolean checkPassword(UserEntity user, String rawPassword) { - return passwordEncoder.matches(rawPassword, user.getPassword()); - } - } From 032424e7c61aed1a8847a7ab45b9b1e03d11f85c Mon Sep 17 00:00:00 2001 From: z <22ad0414@gmail.com> Date: Mon, 12 May 2025 11:50:08 +0900 Subject: [PATCH 18/20] changed format --- .../co/jp/app/controller/PetController.java | 3 +- .../jp/app/controller/UploadController.java | 5 +- src/main/java/co/jp/app/entity/PetEntity.java | 24 ++- .../co/jp/app/repository/PetRepository.java | 9 +- .../java/co/jp/app/service/PetService.java | 3 +- target/classes/.gitignore | 1 + .../maven/co.jp.app/dog-2/pom.properties | 4 +- .../META-INF/maven/co.jp.app/dog-2/pom.xml | 193 ++++++++++-------- target/classes/application.properties | 5 +- .../classes/co/jp/app/Dog1Application.class | Bin 719 -> 719 bytes .../co/jp/app/controller/PetController.class | Bin 1195 -> 1195 bytes .../jp/app/controller/loginController.class | Bin 1204 -> 0 bytes .../jp/app/controller/uploadController.class | Bin 1109 -> 0 bytes .../co/jp/app/entity/ErrorEntity.class | Bin 1003 -> 1003 bytes .../classes/co/jp/app/entity/PetEntity.class | Bin 2449 -> 2449 bytes .../classes/co/jp/app/entity/UserEntity.class | Bin 1499 -> 1499 bytes .../co/jp/app/repository/PetRepository.class | Bin 930 -> 936 bytes .../co/jp/app/repository/erraRepository.class | Bin 715 -> 0 bytes .../jp/app/repository/uploadRepository.class | Bin 916 -> 0 bytes .../co/jp/app/repository/userRepository.class | Bin 667 -> 0 bytes .../co/jp/app/service/PetService.class | Bin 960 -> 960 bytes .../co/jp/app/service/erraService.class | Bin 752 -> 0 bytes .../co/jp/app/service/uploadService.class | Bin 988 -> 0 bytes .../co/jp/app/service/userService.class | Bin 1640 -> 0 bytes 24 files changed, 139 insertions(+), 108 deletions(-) create mode 100644 target/classes/.gitignore delete mode 100644 target/classes/co/jp/app/controller/loginController.class delete mode 100644 target/classes/co/jp/app/controller/uploadController.class delete mode 100644 target/classes/co/jp/app/repository/erraRepository.class delete mode 100644 target/classes/co/jp/app/repository/uploadRepository.class delete mode 100644 target/classes/co/jp/app/repository/userRepository.class delete mode 100644 target/classes/co/jp/app/service/erraService.class delete mode 100644 target/classes/co/jp/app/service/uploadService.class delete mode 100644 target/classes/co/jp/app/service/userService.class diff --git a/src/main/java/co/jp/app/controller/PetController.java b/src/main/java/co/jp/app/controller/PetController.java index 530a677..8be5908 100644 --- a/src/main/java/co/jp/app/controller/PetController.java +++ b/src/main/java/co/jp/app/controller/PetController.java @@ -9,7 +9,6 @@ import org.springframework.web.bind.annotation.RequestParam; import co.jp.app.service.PetService; - @Controller public class PetController { @@ -19,7 +18,7 @@ public class PetController { @GetMapping("/api/dogs/pet") public String getListByEntities(@RequestParam List id) { - service.getPetByID(id); + service.getPetByID(id); return "pet"; } } diff --git a/src/main/java/co/jp/app/controller/UploadController.java b/src/main/java/co/jp/app/controller/UploadController.java index c76027a..1ef704a 100644 --- a/src/main/java/co/jp/app/controller/UploadController.java +++ b/src/main/java/co/jp/app/controller/UploadController.java @@ -9,20 +9,19 @@ import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.PostMapping; import co.jp.app.entity.PetEntity; -import co.jp.app.service.UploadService; @CrossOrigin("http://192.168.1.50:5173") @Controller public class UploadController { @Autowired - private UploadService service; + //private UploadService service; @PostMapping("/api/dogs/upload") public String upload() { List list = new ArrayList(); - service.saveAll(list); + //service.saveAll(list); return "upload"; diff --git a/src/main/java/co/jp/app/entity/PetEntity.java b/src/main/java/co/jp/app/entity/PetEntity.java index 8b8f9ed..b10d7d2 100644 --- a/src/main/java/co/jp/app/entity/PetEntity.java +++ b/src/main/java/co/jp/app/entity/PetEntity.java @@ -5,10 +5,11 @@ import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; import jakarta.persistence.Table; + @Entity @Table(name = "Pet") -public class PetEntity{ -@GeneratedValue(strategy = GenerationType.IDENTITY) +public class PetEntity { + @GeneratedValue(strategy = GenerationType.IDENTITY) @Id private int ID; @@ -27,15 +28,15 @@ public class PetEntity{ //犬の健康状態 private String status; //犬の圖片 - private String image; - - public String getImage() { - return image; - } + private String image; - public void setImage(String image) { - this.image = image; - } + public String getImage() { + return image; + } + + public void setImage(String image) { + this.image = image; + } public String getName() { return name; @@ -92,6 +93,7 @@ public class PetEntity{ public void setStatus(String status) { this.status = status; } + public int getID() { return ID; } @@ -99,5 +101,5 @@ public class PetEntity{ public void setID(int iD) { ID = iD; } - + } diff --git a/src/main/java/co/jp/app/repository/PetRepository.java b/src/main/java/co/jp/app/repository/PetRepository.java index 9c5b065..ecb3674 100644 --- a/src/main/java/co/jp/app/repository/PetRepository.java +++ b/src/main/java/co/jp/app/repository/PetRepository.java @@ -1,6 +1,5 @@ package co.jp.app.repository; - import java.util.List; import org.springframework.data.jpa.repository.JpaRepository; @@ -9,10 +8,8 @@ import co.jp.app.entity.PetEntity; public interface PetRepository extends JpaRepository { -@Override -default List findAllById(Iterable id) { - return findAllById(id); + @Override + default List findAllById(Iterable id) { + return findAllById(id); } } - - diff --git a/src/main/java/co/jp/app/service/PetService.java b/src/main/java/co/jp/app/service/PetService.java index 97d6c7c..a820cda 100644 --- a/src/main/java/co/jp/app/service/PetService.java +++ b/src/main/java/co/jp/app/service/PetService.java @@ -8,7 +8,6 @@ import org.springframework.stereotype.Service; import co.jp.app.entity.PetEntity; import co.jp.app.repository.PetRepository; - @Service public class PetService { @Autowired @@ -17,6 +16,6 @@ public class PetService { public List getPetByID(Iterable id) { return dao.findAllById(id); - + } } diff --git a/target/classes/.gitignore b/target/classes/.gitignore new file mode 100644 index 0000000..9bd6d3a --- /dev/null +++ b/target/classes/.gitignore @@ -0,0 +1 @@ +/co/ diff --git a/target/classes/META-INF/maven/co.jp.app/dog-2/pom.properties b/target/classes/META-INF/maven/co.jp.app/dog-2/pom.properties index 2d965ad..5f2c654 100644 --- a/target/classes/META-INF/maven/co.jp.app/dog-2/pom.properties +++ b/target/classes/META-INF/maven/co.jp.app/dog-2/pom.properties @@ -1,6 +1,6 @@ #Generated by Maven Integration for Eclipse -#Wed May 07 16:32:03 JST 2025 -m2e.projectLocation=C\:\\Users\\ichbi\\OneDrive\\\u30C7\u30B9\u30AF\u30C8\u30C3\u30D7\\dog-1 +#Mon May 12 11:38:52 JST 2025 +m2e.projectLocation=E\:\\jugyo\\asciimg-master\\Dog-1 m2e.projectName=dog-1 groupId=co.jp.app artifactId=dog-2 diff --git a/target/classes/META-INF/maven/co.jp.app/dog-2/pom.xml b/target/classes/META-INF/maven/co.jp.app/dog-2/pom.xml index e38e0de..b3d201c 100644 --- a/target/classes/META-INF/maven/co.jp.app/dog-2/pom.xml +++ b/target/classes/META-INF/maven/co.jp.app/dog-2/pom.xml @@ -1,87 +1,118 @@ - 4.0.0 - - org.springframework.boot - spring-boot-starter-parent - 3.4.5 - - - co.jp.app - dog-2 - 0.0.1-SNAPSHOT - dog-1 - dog introduce project for Spring Boot - - - - - - - - - - - - - - - 17 - - + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 3.4.5 + + + co.jp.app + dog-2 + 0.0.1-SNAPSHOT + dog-1 + dog introduce project for Spring Boot + + + + + + + + + + + + + + + 17 + + - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-data-jpa - - - com.mysql - mysql-connector-j - runtime - - - org.springframework.boot - spring-boot-starter-test - test - - - com.fasterxml.jackson.core - jackson-databind - - + + org.springframework.boot + spring-boot-starter-web + + + io.jsonwebtoken + jjwt-api + 0.11.5 + + + io.jsonwebtoken + jjwt-impl + 0.11.5 + runtime + + + io.jsonwebtoken + jjwt-jackson + 0.11.5 + runtime + + + org.springframework.boot + spring-boot-starter-data-jpa + + + com.mysql + mysql-connector-j + runtime + + + org.springframework.boot + spring-boot-starter-validation + + + org.springframework.boot + spring-boot-starter-test + test + + + org.springframework.boot + spring-boot-starter-security + + + com.fasterxml.jackson.core + jackson-databind + + + org.jetbrains + annotations + 13.0 + compile + + - - - - org.apache.maven.plugins - maven-compiler-plugin - - - - org.projectlombok - lombok - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - org.projectlombok - lombok - - - - - - + + + + org.apache.maven.plugins + maven-compiler-plugin + + + + org.projectlombok + lombok + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + org.projectlombok + lombok + + + + + + \ No newline at end of file diff --git a/target/classes/application.properties b/target/classes/application.properties index e435626..618861c 100644 --- a/target/classes/application.properties +++ b/target/classes/application.properties @@ -7,4 +7,7 @@ spring.jpa.database-platform=org.hibernate.dialect.MySQLDialect spring.datasource.url=jdbc:mysql://192.168.1.192:3306/dog spring.datasource.username=coder spring.datasource.password=coder -spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver \ No newline at end of file +spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver + +jwt.secret=wM7Pz4BxvZ5NcLaBpgJm0eRQ5ztc3W5+OPH0E7g3gcQ= +jwt.token-expiration-ms==900000 \ No newline at end of file diff --git a/target/classes/co/jp/app/Dog1Application.class b/target/classes/co/jp/app/Dog1Application.class index afb8abe87f8ad5660ec0c29950d2ae8def2d78ae..30bb2849bae06c1ad59455fc386d2be4ba3ad322 100644 GIT binary patch delta 207 zcmYL>u?@m76h!YQHg=2yB!Fn3p^QLuR8TPl3y=;$!2rx)JOUG>0#PskO*TS&Ck4N_ z)9K#7TGlfCd|z(>Tg((9x0%KY!cFEGLF~?l(jZ1+A<^-Ij@lr@P$75aQd*2KcDIwi zP<18d!bP9}vnoz2c4C*s1G;Kz!y0NZ&}FqPz@BnS&_ka`!t=Tr19VQs6NCN#-*5w% LW})5i_h|70fQJ>f delta 206 zcmYL@Jqp4=6okKxt{an${~{JPmLXziXXPO*ZL|~h2A*Nb5j=q)C>9>TCWZGA-$ub# z%rMNGVG3R7!Sj880CPqW0Tn~lqN%xTTr-4

x9|A|f_eOG3lFCb?F->SDj%xYag4 zsLRnv)?a|~X~Cwbsjw2(=@oS@?Utao!O#}8-v>H$Mb+uiml7YIm1PiiOnRff{OA2p NWRW5Mb>ycY`v9aq7KZ=; diff --git a/target/classes/co/jp/app/controller/PetController.class b/target/classes/co/jp/app/controller/PetController.class index f48a33814dddc3559e0605db6133c7c16069c112..3e8803fff82f716700291a50559db36681aa781c 100644 GIT binary patch delta 411 zcmXX>O)mpc6g_vQ(`Ux0QD%HqF~0giW@~|sA0R9$A|iuET2c~?#Hznx%+KhCL`W;@xx3yZ4=YUf=H9-q-K@2Y_vCC>Vk;O(YByassa%-^bB)+_{YQ&f3lM zZgN#mMUKk(tyZVi-4U3TYD19Qy}4*QFfro7hLfJkV|rrz_%;M37Z&mk%2-gCr%oP9 zmWxG%$>*k8rp0Zun|@0tJuvrsl#C)U^dq98(l|skh;(NirizF{v}$i~pR;y>RSyFN zjIz3e0eBdr5)?5`+X-?5er8?ZZNM{m47tM;dedwwZ9GGw*EBe55Z&4fX6vt*J1j0e xQJdTWhS5Erv4U)4Fqr+{s1vMUm2PX=fjGFSkX6YoVOxi(Wwj3Fkmw(*1Aiq~D%$`6 delta 402 zcmXX>%}T>S7@SR-ZWEKXR$KqAf7Lcoa`m8I1o5UIRK!!PL0U=`8axTbM~Ha_PrWFJ zf(IYK2l3$5yEvPA*qNPgzMXHsp*b`UK7Zdo0PJGRf(Bh8W5YmJpx6m+1HT*euKc5m zPS}bBvODcwJK7V_>y4&~983wz#u)6_sl|t$VpRESz1oN2OI1yx4P|3NBv5mg2* x(Hjj>m1R~|STO_zu*#!hEnOi`tH!f_4$;R3>hz@gerN9v6#k|y6iT@j5?gg?y*2u#vzJhT}*jF@jNsd$(#c^jD=VT48-}tFc>QNN0Al z9Ui1>m2CtLwAl&ol_nOno?)iL%he(i`m<}(K9?n4Qf{R)<9E{T(ZDq; z-*qM&pE8VdFB}1eL{a;uEZ?di@zH-qF&8wCVfDYAZ5!=*2S(9AQ;-uU*4EcK&%a#B z<)5$R^10RJ_0{}~r#H3jy7&*JXWPp`s0rF1#hqYjkf!~L(27RryNhYi_!HMnbS9M2 z)?JZN2SSZm(%|&Uh;}W02m2bD%+VPDfYvHaXR@h)`<$BECiUOAS7yNCQ=c+@yi diff --git a/target/classes/co/jp/app/controller/uploadController.class b/target/classes/co/jp/app/controller/uploadController.class deleted file mode 100644 index e076c44069ae61ca3b7420adf2bf7793152c8a9a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1109 zcmb7D>rN9v6#k|KT55$-?%og;C}28PgCa$ehG=543K7K^f6cZ-8C-TYv$G|AD@}|f zn)m=dl<`bkE)t{h$DVKI+`evsT8a5sk((i!yS(T@R!!hvWB9*D5XxBLTH zw+sX8DpYoZAzfPB%^=G#+Hp#(3V6*J(e_kqbI2e)h)c+4a5;}53^UBtH9v^Bh$3Fs zp*1=Pq~UL(K#Ruase&OBOVd(y$uR4kh4hp?|DCQ&HHQ%tGZ@Wd4C4$l|L}LoMN8I# zfMLGmoptxzN+bM0Ru{XTl zeAmy_AZaqT&9|j}+BsD>h-2lCLphQ@_f^<9KaXu4+ZVJP-P-zFB1mWe1=<(I8@d_u zlQ+oi=)~0JGvx*}esO=w?ot1Tchl%N-ZHAGLaKLa-`Z%6^UCA<<;ug=a;3a-Z*8UW z=mEp>A6toObELL3B7U~SRm{@vr|6$zBx(Bzr|337I8B%$q#umr6}oXkM%ce}4ECvG zzDm-Wfda0P%y%7d9XII4Fo_vT;(~obM>O^gnRmw+^p-v&xBLZ#x5bH%q))@;8X^Qm zWr==-G%n{vH?Eg6OB^?;Y=&E8b9`ORZ92KqhY0V`H}@Va#yrI?kT!)<$6BP*;;D5B G%fK)2#vYph diff --git a/target/classes/co/jp/app/entity/ErrorEntity.class b/target/classes/co/jp/app/entity/ErrorEntity.class index eccb95cdf2d1c7678897f111800aca8e32edd34a..0b00d1c1dd2f081aadb7dcc26d5d2391a8b4bf82 100644 GIT binary patch literal 1003 zcmah{?P?Q26g`vACZ;z1{zz>bt(sPFAD~(gjj|A{m=N&iBpK3)$!?gP2ze)eC|Cr4 z_y9hXcxJbyt&PgUy?gJRd(XLd=I5{PKL9*MEsvDIb~p3}V^5C9o(inCQ?G7JXzKBQ z9vOl1Kz@|oPzHVPO=qCGRv@K&0>T&Ad^aI*q}n>touPUb1fi8yhe0H;-x$ab(pc$@ zm5Fp@RnS%5D-|dst?ISqaH5U`<|6Cj{`5Z;Y}%TR;|l*p{iNl$-V1EZGpWHiVBfKOmM4x4v8>L-jyo+{XVYti+Nw)VFO>Vb*c8R9>nD%~b MAH?_J_W2O_4JpdJDF6Tf literal 1003 zcmah|?QRl56g@-vC`g5V+KTo=t3plO2dFkNie?k6MhHoN4ltpEuuEnK6W+-mn%J25 z!w2x8jAs@Mt*)9)?#!Kg&b?>uo&Emf>o)*TP%R*Zr5w^lWRMjo59E944Q0^xUUvqn zYX!28b)fBuz*4o=&SM$*912BTLs8&XH}nQ$Pmaf)3aqwMuWn3e>hWG6rF#Oxcckk@ zlu%~2$Vxkj1lAghQcY`g&_5Q~c{?F>q}n>touPUf1R>!%3`jU6;hi*AdShiG9a$B0 zmG@Ew%1EnvZ8@AMrdW=w^ZV2PFqpJ89mfp+dHuBIx6TB%6KnWA=1o5fdrF|x(1ALg zj5^A+Bqh3wgk3poOQW4XKTO+mP0hQFe>I3%Gks-!Hi^CU=|wXyUG-~i4&#-w=V9-S zG;*XYFD;NKzB%vUMzxmI!#tDxf^1g*M7Yd_W;iij^+LM~lrPQfksAuk1p##8wR8%(-TG%;!aWgPzA#xYMIA5T9b$HmwT-1?Z-2#byf9z`TFTI5iLC0x*SCJ0& zfxo5ny7|h|prElm`LFcrGOGD6%6qD!1*L*DK_U=z>SYIx`>GVS!*X4%L{URa9X6u2 zpi6~4`HyUA={HrY9k#WKD$3tfk!ne;swG+PsQZGBv^DFsga0{!pgRXmb0Sz2J&+ygnZnns$m+S(;gkC6M}MuFjB?Nep$74Bx=Jb zjf$+75RmoW=AhmU5%o+VxeHvRn$kfx?^J&7=PM17pbH)yqoZ8V*!NieXIF+Dd#?0u zqq-$qsF6l@1Z9z-2#q7s7DHs9C_CH$57s3~cc1+XnLiGqQWZ^nxAlc{I^??Czq%@Yv$f>NSb|mOYx} z)Hwt^Z0p9`Ha%p&Rgb3Fj}v!y(OJX`*4Vn?QJS-*VdYUzg;<8S8=Y1~ZG_y*qwyPA zAsukuFX^g(~ATqe#0@-gkgH%?A?;x zyO&O;hwk1j*-Rxcy-Hx>|4Ga=X_y{4nO1D3Kb%aD-ApSs)1P4aD}jmsZ86i7VOn$c uZr$!(*~zr&?%lf0^f#Dl2~1B8_wEUpQWTi=srjeppg)6N0QhK|o__;go=igk literal 2449 zcmai#+foxj5Qcj~LI|vevj`~SF#%;gpHLL#v>GA`#_~eTC7B9~VUtQGTD+4NTBT)` z7e0UwW%>6cEU?U$H`6mc-96t-ckllB`|CFmJ*0d$#i%1maf=evDX4eb{p8ve*Du>I zHn(L_3F>^{`JS2+)RD;+Qq)DMBz0TVLzbY?V%6TR*>0_7OJ8|v*ItuqQO^V=ydAeJ z1@-6lgRZN(=a*+W%yEm-93$?#JCYTB7WHd|+O28DphZKh=-RA%YOCb#vegNTM(8B4 zK1;8>1wP@hdd#A6t*%HPYF3@LXoB6Xnyfdxs_!C-4l!xbS>EVuC|5NbY(q5Lnth-8<3T~w-XMx;M zye{wl#{)q(a9j3p78dgx&c<6oBgQkF60G7+t0g>XI_LQ^-`v@h^$iz@{K(a!TPfg< zylyMwYRd!jcrH3kd~#VTrn~ich?XB&-c^dk) z1G&e$!TGR;eb;pvw0!sG3Fx^N67XOd^DuO;SDW>sT=MwEj|Zhb!}ZP2Y$}abH{hAa zjN3X>*zG_xnnWeW(3dHUC`S@>5vx9|E@7ULl%*+}hAPIbqa`{=nXB=3|gWC zv_!#ciME9tKsfX}#>-gQkODF>^^?RmZFU7CZxeOX3`VPE0Mn~j3A#qtF&=jQPRXy> zjM2XHq|x~X-Gmi8&q4BqJEx|9P;&oh{wfikAb|(qlf$4Sx6W2$;)UTQD z8<_^eO!tgTvu37&Fw;XY%|$SAtp-d(n&|=lMMvvt_zN}<*3-O^X^tMj>To@c{h;A6 z(;}FbBAB>u0;Uno^w`KW8fJ2gO!H=@(J<30nDP-!+`|FWxMq4{%-yMQ?p_+1o|3OcXpSkWve$cduHDAo@dXQA3wi+C!)vnFh?myGfmg*^i1CCnZi+0otdwF z;q8T=IZ87scldj5+T3ZIFHbt6sTieXixIOJO}`2t?23l;<%unxIF75hlCI-3TG;RK zx7<_Q>dy8yMoae6c_kM%9BnTcNx*;(q=T9n7-@ULDzvS8#wY^AcoK_22dxkZH~XxF(K}8 z-~ZrxXhrssbfns0G*qoMPJrQ1AJ7_Go$?XRBq>kgm zv^te&+}!>@MxyE4LRqMaV%9J~ZW)xJEYAJtJYBUkMfrtLr*7+zduW8h2pHv%c@VZ` zyjr{57;RQFXoRjn3bRN$QN66x{&|?~=|1YTHG@hzEswPDkWmr$hjELvE1RX*Y%McP2~6HO;3-=+nqbn*^%T`0Reb5521@^k3J zeCRM4sp9h5J?hXRax-`=*cdI*9jyIK)lazmlc|!(v`i~d{mry;PSt*f1#Ce$5y2NIi9s|?5Q)?#@@{E2W$}7f@Afo&CtqkH zG4X{Tzz=2o&s_uNxaymoo1NMJ{&r^W*Y6)ciRdXk9;6iYY3xXMjGupzMy&NzL%bnR!4ch_Kk8H%6h3BKOb!i7`3u?Y$zjgMX z6A-PPb;1+X=ezs0YVDn%$;3OVP3X=fhIU*#XgdgJ14n-dR39oY0O16-E%5^O38mR_ zn4Z^xp_pl==KrBQao?nXg-XJC@=sAzX;Yl5Lt&6u$iUrB)*2Kcd_!{L^J`I z63yd_agam{vMU|Q_K#BCAO zWh#bD4-%P1;!Kr9rnO|IkvP)|m{xl*MI+K>8Vi{oCNho3nbs1S){~jW<4hZ1+U&s; V4Q7|A6t?G4xNd|a&!e+R^apQ~^1T26 diff --git a/target/classes/co/jp/app/repository/PetRepository.class b/target/classes/co/jp/app/repository/PetRepository.class index 4138eb6b060146247a4cea49769d118176e339f6..06059336ab4aa3ceffb752d6af4cbdc96f1812ab 100644 GIT binary patch delta 318 zcmYk0y>7xl5QOIr@DXglK==zu;|^R<(IA0@sA$477_g8mlt>Yxi}C_#Eb{~uh>{ix zL>-<9#MnUz#qG|{&Fb5g+9>nqvOfUm;6*_SSpM0nD#Qg$&sjLlne#Sn4o99lo-1hn zciZo_f~D}X@&5b7)gh2Jppf)Wr{E&&ib7Q&|GzqzyC2SI<_2qN1$FuPr3voD_!6W_ zb}n;%h^7>D_E-9nJ=w5#FeJ9rF=SXZ=7BV_tfk)!OyoE*jXVncf21~|T<8?3N^}yu k3NU*E^2+o=j(y|k4f}}7A4=Y#M1%^Dk$8$~?RM((72yLYk^lez delta 308 zcmZ3%zKC7?)W2Q(7#J9A8Kk)xm>8JZ8CZB2SQ*$R@~Td3HkV{);9z7B$Vx0r)Xz!G zOV{^L%1TWxVQ1i)=xxQy;+&t7I@y@<^u#?Glm9VlPflj4o$Sb@RL{l;G>V;pk%1Fv zG82#n8py!RzzyX20r^ZonnO!_Cj%oB!v-LmnSlpLvH{gGFz_+(0!cB58X%7!$OEco z5MU4l$_oM6JYaPo5n&)p1SrA^bRv)v1!5)!F#*SDpnc*%CdfV`AdPMx6Ow&gVEbTZ ULhOT?2{e=mYN`Z-B-nH*0GJdXasU7T diff --git a/target/classes/co/jp/app/repository/erraRepository.class b/target/classes/co/jp/app/repository/erraRepository.class deleted file mode 100644 index 59125c6f9a906834f9095e4b23a9c2ee762d18f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 715 zcmaJ<%TC)s6g^`S%p)`*0s30esuFa8)dj0SrGkQ#%6$kb_LF4lOq$HN<8csDKdM{0 z=m+$pDvkr9rfMo{e4lggxo7UL-#>l=IK-1x1Xu`BsiBHRf#-c2jnYV_Y2;LDGwrRr zj5^NA(>qfjOq4&m><$FBce=arpF7HU?PvMcb!K`y#F9W`B&RYOOOr$&dLz~MAyx$T ztxKXTb=oAKot&r(>%K$-=_Mh^a{ssKz4n!3J5U1kSR3^|pY)XbBzt3enz8N6@ws%m zuy36eKh&APixSMaqqPMB&9Ow6nBOTsw1bbbfaaBBjc2DhhnlE!ooP0>3%xPMdg-+_ zOnMd19jny$YpzJ_tOA=>r*fQgfaNot80m9I{agGuY3=!y|3}zCY4U$OP^nGVc$FyE zeoaU#XEt|zb)pMmTlY6$uRz9a2@ryyxk;p~SRgE5mDT|x0p-%mr&kaGzEclSm~;eP^ZOgG_cNilX{i>Q?z($MePlq&5XW)*NS2f@n|L=Ujqtm$ld?| diff --git a/target/classes/co/jp/app/repository/uploadRepository.class b/target/classes/co/jp/app/repository/uploadRepository.class deleted file mode 100644 index dde1f62bb2af4c6ea6f96ce1273d59670792e44a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 916 zcmbVKO;6iE5Pj}hys3Mr4hYQdOLY=WL3z0l~~V3jiLFJ`MEcg zed}VL;k`BiPhz8@;L?a2d8f@a9|$W*i73lBjYU~Q^`jn0hK8>qc{aM~NpqfZGc5bM zFT$_FsMLQ5R_&Ea7~c5*RH4UElaWO1DS%B%M>Do6G15$egZ#BuwW4^d&Yj@K=8ToXhd? diff --git a/target/classes/co/jp/app/repository/userRepository.class b/target/classes/co/jp/app/repository/userRepository.class deleted file mode 100644 index 8b068cf71ac28cda7cf6b2b16ed23574b40dae3b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 667 zcmbV~!A=4(5Qe8Hu7D_t9z1)&nAnr2RTE9nXfPOv9=sJ8*5cAOZBdDD=D`Q>p^UR^ z!mbH1#zWK2r1QSD^ZqaBby|z<+=g@ZMW&q0!Y9sM1 zcq~-J+r1I?eE=&Ajn42;B&=X-i6on^JJ)2e=CN1N;RA zMRXxuyY_DcadH*ioHJ+cnKN_8*4T31zh2(}?4fQ!5CU~efp4Kia0byR3eza-ho_f= zZfBTxck<76t-PCL$#9=wY&XscrK793TZMs1i3+N!O&9q`L$yTDt$;8uVWMnf5z7{q z^1Hex5x^tZy(Ehd()959I95+IQc9fMa3~)`5XBI)#j4;5X2Hx07;RP|GclXZXUGTr zJjGa;0f}ji+5iVLtOzbVj-TaPU`~geaV1#W%}4mH7jzZ`?pYi7&vJE^|Kt13;t8yv d#+j?^mU?H=S>tM*J0`Ix)@*3p{QJii@D07`D)s;X delta 355 zcmYL^&rZTX5XQgR(k{>z5d;+fR4XJ3F}#49SWhN;@S-;_R+1)&G2!CLXV~;bBr!2^ zFr0l5AH(>y7(L8<`_0b$W_PaVy7l=z`v7o+ZW#)eM!|y(#|#>6=P(&3lVgFkw|`Ya z5habX2N$040}~xoT~x57QT4ElnjkdiVMX8$lW}}98bwcMaT-bAJYL&{(}(!ZeBGph znxywKOpUsDE^;9t%tTV_bPjces;GPhbAxU`6{_8PgG}@5CUbTT_-HX_05)J1Yg9oS zHCXxZC1KejxAzL&e}}K|LTlaPpHa^l%|+iYgA-WC23ebIU+}Za7ApZOw$K3E422y= Mn4fn4{?P$`05ozW5&!@I diff --git a/target/classes/co/jp/app/service/erraService.class b/target/classes/co/jp/app/service/erraService.class deleted file mode 100644 index 8d2358caca184255904f8ddce3fd1bf3f417946d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 752 zcma)4O>Yx15PjYzS(>D68lX^0DG{oa_JFTQ;X?%#DN^`QgK~E^)6{9QUU|K(@~=Qb zLU8C0=#N5-H&K#94;*&hj6Lto%#LsW{<#7028}WTtc564QAA0gHd0qgj#WIAU-~18 zoIvTdjYfnLzJtipenE*897R%N)nlpz0wiMQ)^Xs<_l~RM`x6nR6Ap* z0*9R?!!FKq(lV`8!6vps)T-D!dOFqpF`dM*amr~Ervk4!#tvngSRD_~t(wrav6r$>Do*9Oiu@!}EeP@?bLLuG z8nA5PgBg&(R!7J5Ih*v!ep4(jQ16&XjeE*!AI}d9?m~0DgOz6Q_>C;P!LxO_zbu_i z7-$|-w0U2j$X%GhSLNGuWLd4;HJOd*qxNNME9-dacPr4mbGnqtWZX0%Ip1Cj4PJJ@ z&qVOY>t?*qUWxGmW5CF7hV4U+B%{wO9{+;)kzeny_1B*Kh^-gk1U$wrqrel?S;Ujy xG5SK4komtvk!VB-=DNF5hc2RKPNzZb7uxR!<@DJLzw8sDd diff --git a/target/classes/co/jp/app/service/uploadService.class b/target/classes/co/jp/app/service/uploadService.class deleted file mode 100644 index 8d714834cb936e2df039235b255e6066113df6f7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 988 zcma)5+iuf95IyT$++3jPg+RHLK!LPKti%&iN~MU4gk+#JkoS$VO*c4RYrRgDzXAyf z!2=(_MeNLm!BJnW2TcIKR!+3~O6KYjvuhMh7Tu=nA7!d*;mB6GeQDGt*f*Oafk! zRIXK$!Z(+-$WTAeFp2)MJXsRIe}*zcp729yU#1+B)&cR=-bj0*`-dX!pXNxsrH&ee z!X}2==`EY{1)%@F!Uf?B<&I8_FJGx_falihar(*(&806DQ@v7KngE||V+##hUxyZ- zk)#DCy+Kxy^d@PCH2no6uaLz_Gtz~pIEw8kBl9lUV?+VT&x5t}Aj`@_PbH zi7I~A?UgPMA1V=uF}Z zbTJHlh7ChX-f}}7UaCwk3%A73lPNS(n$gPj7IN7iZ0up^Zfs26a%7-g-)qBOh9mEO zyS=rx_WtGXTWf#5`}zLc`wutoJlMSZPQk9WErebtVo8D=De$=%w?OXsHqs{GoMwAg0B{M7#RNM72%_>OH^~Gtf;o! zQI$aZJgDK}+rTD0$Dflbmn{;o%Oo=FF1VhYDlgAUbxq8cNYhpD9Z@O@<(hR(Y3ZA8 z$Z)U;+zuUCa6Ilc<)8aHOx6sdUS-=!PzV%zK`%g=rYt zJF{cFSt-1b&kM)2JQsBXo-b>E)m3uNfLC&X+EuD4xoR#B!}aF6)%vxmY#-HRn~3_L z%P5lNQ7(q-M$^}PF|^3)UFlF_b-QxZiQYD*flv5O&1m5)T@gX8c8U6RB6fx-;*wBW zaIJ_D;)7V@*BY`Y5xm5VUsjI%&NU6u+4P1SGk6&?J92E8lfJG5lGmP`90uuyiqYFf zxtceMq!`I97)2aow3;>#9?gl-4Y1L%r?4MJXU1vV743AvqKn;*9vmgzq3UTI1E&?) zMP6AX9mfgsc9P`w7^#8d^q-=?l|r7Tnc*vZP3}zKC*-Jw=KSar*yGQTis3d=FVKCX zt7ikfuV0|=#s>DEwbItuItJ3#_&N@yt)uH0G8Sp;8Af9G8+{MRNgM|60oXM5A%%YQ z;xJ(y#t41m6!0W{2LI`5&^rD+zQGv+MnLc_NrtOD&XN=-`$6PzjsTx0Z5*r@6C_x4 dygN!W6(?(u9mt}Q>IITxxEPK3Isun}{{Y)ayNmz; From c415f059aaaa63ec0f7ed22fa9823888e6578262 Mon Sep 17 00:00:00 2001 From: admin Date: Mon, 12 May 2025 14:06:12 +0900 Subject: [PATCH 19/20] =?UTF-8?q?=E5=A2=9E=E5=8A=A0@Lazy=E6=B3=A8=E8=A7=A3?= =?UTF-8?q?=E6=B6=88=E9=99=A4=E4=BE=9D=E8=B5=96=E5=BE=AA=E7=8E=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../co/jp/app/config/security/SecurityConfig.java | 10 ++++++---- .../security/filter/JwtAuthenticationFilter.java | 11 ++++++----- 2 files changed, 12 insertions(+), 9 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 85642a6..131727c 100644 --- a/src/main/java/co/jp/app/config/security/SecurityConfig.java +++ b/src/main/java/co/jp/app/config/security/SecurityConfig.java @@ -4,6 +4,7 @@ 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; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.AuthenticationProvider; import org.springframework.security.authentication.dao.DaoAuthenticationProvider; @@ -11,6 +12,7 @@ import org.springframework.security.config.annotation.authentication.configurati import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer; import org.springframework.security.config.http.SessionCreationPolicy; +import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.web.SecurityFilterChain; @@ -20,11 +22,11 @@ import org.springframework.security.web.authentication.UsernamePasswordAuthentic public class SecurityConfig { private final JwtAuthenticationFilter jwtAuthenticationFilter; - private final UserService userService; + private final UserDetailsService userDetailsService; - public SecurityConfig(JwtAuthenticationFilter jwtAuthenticationFilter, UserService userService) { + public SecurityConfig(@Lazy JwtAuthenticationFilter jwtAuthenticationFilter, @Lazy UserDetailsService userDetailsService) { this.jwtAuthenticationFilter = jwtAuthenticationFilter; - this.userService = userService; + this.userDetailsService = userDetailsService; } @Bean @@ -35,7 +37,7 @@ public class SecurityConfig { @Bean public AuthenticationProvider authenticationProvider() { DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider(); - authProvider.setUserDetailsService(userService); + authProvider.setUserDetailsService(userDetailsService); authProvider.setPasswordEncoder(passwordEncoder()); return authProvider; } 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 b2e857f..7102e75 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 @@ -1,16 +1,17 @@ package co.jp.app.config.security.filter; -import co.jp.app.service.UserService; import co.jp.app.service.JwtService; import java.io.IOException; import jakarta.servlet.FilterChain; import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; +import org.springframework.context.annotation.Lazy; import org.springframework.lang.NonNull; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.web.authentication.WebAuthenticationDetailsSource; import org.springframework.stereotype.Component; import org.springframework.web.filter.OncePerRequestFilter; @@ -20,11 +21,11 @@ import org.springframework.web.filter.OncePerRequestFilter; public class JwtAuthenticationFilter extends OncePerRequestFilter { private final JwtService jwtService; - private final UserService userService; + private final UserDetailsService userDetailsService; - public JwtAuthenticationFilter(JwtService jwtService, UserService userService) { + public JwtAuthenticationFilter(JwtService jwtService, UserDetailsService userDetailsService) { this.jwtService = jwtService; - this.userService = userService; + this.userDetailsService = userDetailsService; } @Override @@ -44,7 +45,7 @@ public class JwtAuthenticationFilter extends OncePerRequestFilter { username = jwtService.extractUsername(jwt); if (username != null && SecurityContextHolder.getContext().getAuthentication() == null) { - UserDetails userDetails = this.userService.loadUserByUsername(username); + UserDetails userDetails = this.userDetailsService.loadUserByUsername(username); if (jwtService.isTokenValid(jwt, userDetails)) { UsernamePasswordAuthenticationToken authToken = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities()); From 34de018ef0606dec4f6de48c8cc5c3f073a1fdc6 Mon Sep 17 00:00:00 2001 From: admin Date: Mon, 12 May 2025 14:09:36 +0900 Subject: [PATCH 20/20] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E7=AC=A6=E5=8F=B7?= =?UTF-8?q?=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 618861c..cc45d08 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -10,4 +10,4 @@ spring.datasource.password=coder spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver jwt.secret=wM7Pz4BxvZ5NcLaBpgJm0eRQ5ztc3W5+OPH0E7g3gcQ= -jwt.token-expiration-ms==900000 \ No newline at end of file +jwt.token-expiration-ms=900000 \ No newline at end of file