Skip to content

Commit 8d9f609

Browse files
authored
[FIX] nginx reload 스크립트 고침 (#1023)
2 parents 10a332a + 90dd931 commit 8d9f609

13 files changed

+84
-45
lines changed

Diff for: backend/src/main/java/codezap/auth/configuration/AuthArgumentResolver.java

+23-8
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,29 @@
11
package codezap.auth.configuration;
22

3-
import codezap.auth.dto.Credential;
4-
import codezap.auth.manager.CredentialManager;
5-
import codezap.auth.provider.CredentialProvider;
6-
import codezap.member.domain.Member;
7-
import jakarta.servlet.http.HttpServletRequest;
3+
import java.util.List;
84
import java.util.Objects;
9-
import lombok.RequiredArgsConstructor;
5+
6+
import jakarta.servlet.http.HttpServletRequest;
7+
108
import org.springframework.core.MethodParameter;
119
import org.springframework.lang.NonNull;
1210
import org.springframework.web.bind.support.WebDataBinderFactory;
1311
import org.springframework.web.context.request.NativeWebRequest;
1412
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
1513
import org.springframework.web.method.support.ModelAndViewContainer;
1614

15+
import codezap.auth.dto.Credential;
16+
import codezap.auth.manager.CredentialManager;
17+
import codezap.auth.provider.CredentialProvider;
18+
import codezap.global.exception.CodeZapException;
19+
import codezap.global.exception.ErrorCode;
20+
import codezap.member.domain.Member;
21+
import lombok.RequiredArgsConstructor;
22+
1723
@RequiredArgsConstructor
1824
public class AuthArgumentResolver implements HandlerMethodArgumentResolver {
1925

20-
private final CredentialManager credentialManager;
26+
private final List<CredentialManager> credentialManagers;
2127
private final CredentialProvider credentialProvider;
2228

2329
@Override
@@ -35,10 +41,19 @@ public Member resolveArgument(
3541
AuthenticationPrinciple parameterAnnotation = parameter.getParameterAnnotation(AuthenticationPrinciple.class);
3642
boolean supported = Objects.nonNull(parameterAnnotation);
3743
HttpServletRequest request = (HttpServletRequest) webRequest.getNativeRequest();
38-
if (supported && !parameterAnnotation.required() && !credentialManager.hasCredential(request)) {
44+
if (supported && !parameterAnnotation.required() && !hasCredential(request)) {
3945
return null;
4046
}
47+
CredentialManager credentialManager = credentialManagers.stream()
48+
.filter(cm -> cm.hasCredential(request))
49+
.findFirst()
50+
.orElseThrow(() -> new CodeZapException(ErrorCode.UNAUTHORIZED_USER, "인증 정보가 없습니다. 다시 로그인해 주세요."));
4151
Credential credential = credentialManager.getCredential(request);
4252
return credentialProvider.extractMember(credential);
4353
}
54+
55+
private boolean hasCredential(HttpServletRequest request) {
56+
return credentialManagers.stream()
57+
.anyMatch(cm -> cm.hasCredential(request));
58+
}
4459
}
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,24 @@
11
package codezap.auth.configuration;
22

3-
import codezap.auth.provider.CredentialProvider;
43
import java.util.List;
54

65
import org.springframework.context.annotation.Configuration;
76
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
87
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
98

109
import codezap.auth.manager.CredentialManager;
10+
import codezap.auth.provider.CredentialProvider;
1111
import lombok.RequiredArgsConstructor;
1212

1313
@Configuration
1414
@RequiredArgsConstructor
1515
public class AuthWebConfiguration implements WebMvcConfigurer {
1616

17-
private final CredentialManager credentialManager;
17+
private final List<CredentialManager> credentialManagers;
1818
private final CredentialProvider credentialProvider;
1919

2020
@Override
2121
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
22-
resolvers.add(new AuthArgumentResolver(credentialManager, credentialProvider));
22+
resolvers.add(new AuthArgumentResolver(credentialManagers, credentialProvider));
2323
}
2424
}
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,35 @@
11
package codezap.auth.controller;
22

3-
import codezap.auth.dto.LoginMember;
4-
import codezap.auth.dto.request.LoginRequest;
5-
import codezap.auth.dto.response.LoginResponse;
6-
import codezap.auth.dto.Credential;
7-
import codezap.auth.manager.CredentialManager;
8-
import codezap.auth.provider.CredentialProvider;
9-
import codezap.auth.service.AuthService;
3+
import java.util.List;
4+
105
import jakarta.servlet.http.HttpServletRequest;
116
import jakarta.servlet.http.HttpServletResponse;
127
import jakarta.validation.Valid;
13-
import lombok.RequiredArgsConstructor;
8+
149
import org.springframework.http.ResponseEntity;
1510
import org.springframework.web.bind.annotation.GetMapping;
1611
import org.springframework.web.bind.annotation.PostMapping;
1712
import org.springframework.web.bind.annotation.RequestBody;
1813
import org.springframework.web.bind.annotation.RestController;
1914

15+
import codezap.auth.configuration.AuthenticationPrinciple;
16+
import codezap.auth.dto.Credential;
17+
import codezap.auth.dto.LoginMember;
18+
import codezap.auth.dto.request.LoginRequest;
19+
import codezap.auth.dto.response.LoginResponse;
20+
import codezap.auth.manager.CredentialManager;
21+
import codezap.auth.provider.CredentialProvider;
22+
import codezap.auth.service.AuthService;
23+
import codezap.global.exception.CodeZapException;
24+
import codezap.global.exception.ErrorCode;
25+
import codezap.member.domain.Member;
26+
import lombok.RequiredArgsConstructor;
27+
2028
@RestController
2129
@RequiredArgsConstructor
2230
public class AuthController implements SpringDocAuthController {
2331

24-
private final CredentialManager credentialManager;
32+
private final List<CredentialManager> credentialManagers;
2533
private final CredentialProvider credentialProvider;
2634
private final AuthService authService;
2735

@@ -32,20 +40,24 @@ public ResponseEntity<LoginResponse> login(
3240
) {
3341
LoginMember loginMember = authService.login(request);
3442
Credential credential = credentialProvider.createCredential(loginMember);
35-
credentialManager.setCredential(httpServletResponse, credential);
43+
credentialManagers.forEach(cm -> cm.setCredential(httpServletResponse, credential));
3644
return ResponseEntity.ok(LoginResponse.from(loginMember));
3745
}
3846

3947
@GetMapping("/login/check")
40-
public ResponseEntity<Void> checkLogin(HttpServletRequest httpServletRequest) {
41-
Credential credential = credentialManager.getCredential(httpServletRequest);
42-
credentialProvider.extractMember(credential);
48+
public ResponseEntity<Void> checkLogin(
49+
@AuthenticationPrinciple Member member,
50+
HttpServletRequest httpServletRequest
51+
) {
52+
if (member == null) {
53+
throw new CodeZapException(ErrorCode.UNAUTHORIZED_USER, "인증 정보가 없습니다. 다시 로그인해 주세요.");
54+
}
4355
return ResponseEntity.ok().build();
4456
}
4557

4658
@PostMapping("/logout")
4759
public ResponseEntity<Void> logout(HttpServletResponse httpServletResponse) {
48-
credentialManager.removeCredential(httpServletResponse);
60+
credentialManagers.forEach(cm -> cm.removeCredential(httpServletResponse));
4961
return ResponseEntity.noContent().build();
5062
}
5163
}

Diff for: backend/src/main/java/codezap/auth/controller/SpringDocAuthController.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import codezap.auth.dto.response.LoginResponse;
1111
import codezap.global.swagger.error.ApiErrorResponse;
1212
import codezap.global.swagger.error.ErrorCase;
13+
import codezap.member.domain.Member;
1314
import io.swagger.v3.oas.annotations.Operation;
1415
import io.swagger.v3.oas.annotations.headers.Header;
1516
import io.swagger.v3.oas.annotations.responses.ApiResponse;
@@ -41,7 +42,7 @@ public interface SpringDocAuthController {
4142
@ErrorCase(description = "쿠키 없음", exampleMessage = "쿠키가 없어서 회원 정보를 찾을 수 없습니다. 다시 로그인해주세요."),
4243
@ErrorCase(description = "인증 쿠키 없음", exampleMessage = "인증에 대한 쿠키가 없어서 회원 정보를 찾을 수 없습니다. 다시 로그인해주세요."),
4344
})
44-
ResponseEntity<Void> checkLogin(HttpServletRequest request);
45+
ResponseEntity<Void> checkLogin(Member member, HttpServletRequest request);
4546

4647
@Operation(summary = "로그아웃")
4748
@ApiResponse(responseCode = "204", description = "인증 성공")

Diff for: backend/src/main/java/codezap/auth/dto/LoginMember.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,12 @@
22

33
import codezap.member.domain.Member;
44

5-
public record LoginMember (
5+
public record LoginMember(
66
long id,
77
String name,
88
String password,
99
String salt
10-
){
10+
) {
1111
public static LoginMember from(Member member) {
1212
return new LoginMember(member.getId(), member.getName(), member.getPassword(), member.getSalt());
1313
}

Diff for: backend/src/main/java/codezap/auth/manager/AuthorizationHeaderCredentialManager.java

+7-3
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,17 @@
11
package codezap.auth.manager;
22

3+
import jakarta.servlet.http.HttpServletRequest;
4+
import jakarta.servlet.http.HttpServletResponse;
5+
6+
import org.springframework.http.HttpHeaders;
7+
import org.springframework.stereotype.Component;
8+
39
import codezap.auth.dto.Credential;
410
import codezap.global.exception.CodeZapException;
511
import codezap.global.exception.ErrorCode;
6-
import jakarta.servlet.http.HttpServletRequest;
7-
import jakarta.servlet.http.HttpServletResponse;
812
import lombok.RequiredArgsConstructor;
9-
import org.springframework.http.HttpHeaders;
1013

14+
@Component
1115
@RequiredArgsConstructor
1216
public class AuthorizationHeaderCredentialManager implements CredentialManager {
1317

Diff for: backend/src/main/java/codezap/auth/manager/CookieCredentialManager.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,20 @@
11
package codezap.auth.manager;
22

3-
import codezap.auth.dto.Credential;
43
import java.util.Arrays;
54

65
import jakarta.servlet.http.Cookie;
76
import jakarta.servlet.http.HttpServletRequest;
87
import jakarta.servlet.http.HttpServletResponse;
98

10-
import lombok.RequiredArgsConstructor;
119
import org.springframework.boot.web.server.Cookie.SameSite;
1210
import org.springframework.http.HttpHeaders;
1311
import org.springframework.http.ResponseCookie;
1412
import org.springframework.stereotype.Component;
1513

14+
import codezap.auth.dto.Credential;
1615
import codezap.global.exception.CodeZapException;
1716
import codezap.global.exception.ErrorCode;
17+
import lombok.RequiredArgsConstructor;
1818

1919
@Component
2020
@RequiredArgsConstructor

Diff for: backend/src/main/java/codezap/auth/manager/CredentialManager.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
package codezap.auth.manager;
22

3-
import codezap.auth.dto.Credential;
43
import jakarta.servlet.http.HttpServletRequest;
54
import jakarta.servlet.http.HttpServletResponse;
65

6+
import codezap.auth.dto.Credential;
7+
78
/**
89
* Credential 정보를 Http 응답에 설정하기 위한 클래스입니다.
910
*/

Diff for: backend/src/main/java/codezap/auth/provider/CredentialProvider.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package codezap.auth.provider;
22

3-
import codezap.auth.dto.LoginMember;
43
import codezap.auth.dto.Credential;
4+
import codezap.auth.dto.LoginMember;
55
import codezap.member.domain.Member;
66

77
/**

Diff for: backend/src/main/java/codezap/auth/provider/basic/BasicAuthCredentialProvider.java

+4-3
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
package codezap.auth.provider.basic;
22

3-
import codezap.auth.dto.LoginMember;
4-
import codezap.auth.dto.Credential;
53
import java.nio.charset.StandardCharsets;
64

75
import jakarta.servlet.http.HttpServletRequest;
86

97
import org.springframework.http.HttpHeaders;
108
import org.springframework.stereotype.Component;
119

10+
import codezap.auth.dto.Credential;
11+
import codezap.auth.dto.LoginMember;
1212
import codezap.auth.provider.CredentialProvider;
1313
import codezap.global.exception.CodeZapException;
1414
import codezap.global.exception.ErrorCode;
@@ -24,7 +24,8 @@ public class BasicAuthCredentialProvider implements CredentialProvider {
2424

2525
@Override
2626
public Credential createCredential(LoginMember loginMember) {
27-
String credentialValue = HttpHeaders.encodeBasicAuth(loginMember.name(), loginMember.password(), StandardCharsets.UTF_8);
27+
String credentialValue = HttpHeaders.encodeBasicAuth(loginMember.name(), loginMember.password(),
28+
StandardCharsets.UTF_8);
2829
return Credential.basic(credentialValue);
2930
}
3031

Diff for: backend/src/main/java/codezap/auth/service/AuthService.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
package codezap.auth.service;
22

3+
import org.springframework.stereotype.Service;
4+
import org.springframework.transaction.annotation.Transactional;
5+
36
import codezap.auth.dto.LoginMember;
47
import codezap.auth.dto.request.LoginRequest;
58
import codezap.auth.encryption.PasswordEncryptor;
@@ -8,8 +11,6 @@
811
import codezap.member.domain.Member;
912
import codezap.member.repository.MemberRepository;
1013
import lombok.RequiredArgsConstructor;
11-
import org.springframework.stereotype.Service;
12-
import org.springframework.transaction.annotation.Transactional;
1314

1415
@Service
1516
@RequiredArgsConstructor

Diff for: backend/src/test/java/codezap/auth/configuration/AuthArgumentResolverTest.java

+8-4
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,10 @@
55

66
import codezap.auth.dto.LoginMember;
77
import codezap.auth.dto.Credential;
8+
import codezap.auth.manager.AuthorizationHeaderCredentialManager;
89
import java.lang.reflect.Method;
910

11+
import java.util.List;
1012
import org.junit.jupiter.api.DisplayName;
1113
import org.junit.jupiter.api.Nested;
1214
import org.junit.jupiter.api.Test;
@@ -28,8 +30,10 @@
2830

2931
class AuthArgumentResolverTest {
3032
private final CredentialProvider credentialProvider = new PlainCredentialProvider();
31-
private final CredentialManager credentialManager = new CookieCredentialManager();
32-
private final AuthArgumentResolver authArgumentResolver = new AuthArgumentResolver(credentialManager, credentialProvider);
33+
private final List<CredentialManager> credentialManagers =
34+
List.of(new CookieCredentialManager(), new AuthorizationHeaderCredentialManager());
35+
36+
private final AuthArgumentResolver authArgumentResolver = new AuthArgumentResolver(credentialManagers, credentialProvider);
3337

3438
@Nested
3539
@DisplayName("지원하는 파라미터 테스트")
@@ -131,7 +135,7 @@ void noCredentialTest() {
131135
//when & then
132136
assertThatThrownBy(() -> resolveArgument(requiredMethod, nativeWebRequest))
133137
.isInstanceOf(CodeZapException.class)
134-
.hasMessage("쿠키가 없어서 회원 정보를 찾을 수 없습니다. 다시 로그인해주세요.");
138+
.hasMessage("인증 정보가 없습니다. 다시 로그인해 주세요.");
135139
}
136140

137141
@Test
@@ -159,7 +163,7 @@ private Member resolveArgument(Method method, NativeWebRequest webRequest) {
159163
private void setCredentialCookie(MockHttpServletRequest request, Member member) {
160164
MockHttpServletResponse mockResponse = new MockHttpServletResponse();
161165
Credential credential = credentialProvider.createCredential(LoginMember.from(member));
162-
credentialManager.setCredential(mockResponse, credential);
166+
credentialManagers.forEach(cm -> cm.setCredential(mockResponse, credential));
163167
request.setCookies(mockResponse.getCookies());
164168
}
165169
}

Diff for: backend/submodules/private

0 commit comments

Comments
 (0)