Skip to content

Commit

Permalink
Merge pull request #267 from zeus6768/feat/member
Browse files Browse the repository at this point in the history
이메일 회원가입, 로그인, 로그아웃 구현
  • Loading branch information
zeus6768 authored Aug 6, 2024
2 parents 5feb1ec + eaa0c4c commit ff5276b
Show file tree
Hide file tree
Showing 19 changed files with 985 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,8 @@ public class WebCorsConfiguration implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowCredentials(true)
.allowedOriginPatterns("*")
.allowedMethods("*")
.exposedHeaders("*");
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package codezap.member.configuration;

import jakarta.servlet.http.HttpServletRequest;

import org.springframework.core.MethodParameter;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;

import codezap.member.service.AuthService;
import lombok.RequiredArgsConstructor;

@RequiredArgsConstructor
public class AuthArgumentResolver implements HandlerMethodArgumentResolver {

private final AuthService authService;

@Override
public boolean supportsParameter(MethodParameter parameter) {
return parameter.hasParameterAnnotation(BasicAuthentication.class);
}

@Override
public Object resolveArgument(
MethodParameter parameter,
ModelAndViewContainer mavContainer,
NativeWebRequest webRequest,
WebDataBinderFactory binderFactory
) {
HttpServletRequest request = (HttpServletRequest) webRequest.getNativeRequest();
return authService.authorizeByCookie(request.getCookies());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package codezap.member.configuration;

import java.util.List;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import codezap.member.service.AuthService;
import lombok.RequiredArgsConstructor;

@Configuration
@RequiredArgsConstructor
public class AuthWebConfiguration implements WebMvcConfigurer {

private final AuthService authService;

@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
resolvers.add(new AuthArgumentResolver(authService));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package codezap.member.configuration;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface BasicAuthentication {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
package codezap.member.controller;

import java.nio.charset.StandardCharsets;

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.Valid;

import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseCookie;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;

import codezap.member.dto.LoginRequest;
import codezap.member.dto.MemberDto;
import codezap.member.dto.SignupRequest;
import codezap.member.service.MemberService;
import lombok.RequiredArgsConstructor;

@RestController
@RequiredArgsConstructor
public class MemberController implements SpringDocMemberController {

private final MemberService memberService;

@PostMapping("/signup")
@ResponseStatus(HttpStatus.CREATED)
public void signup(@Valid @RequestBody SignupRequest request) {
memberService.signup(request);
}

@GetMapping("/check-email")
@ResponseStatus(HttpStatus.OK)
public void checkUniqueEmail(@RequestParam String email) {
memberService.assertUniqueEmail(email);
}

@GetMapping("/check-username")
@ResponseStatus(HttpStatus.OK)
public void checkUniqueUsername(@RequestParam String username) {
memberService.assertUniqueUsername(username);
}

@PostMapping("/login")
@ResponseStatus(HttpStatus.OK)
public void login(@Valid @RequestBody LoginRequest request, HttpServletResponse response) {
MemberDto member = memberService.login(request);
String basicAuth = HttpHeaders.encodeBasicAuth(member.email(), member.password(), StandardCharsets.UTF_8);
ResponseCookie cookie = ResponseCookie.from(HttpHeaders.AUTHORIZATION, basicAuth)
.maxAge(-1)
.path("/")
.secure(true)
.httpOnly(true)
.build();
response.setHeader(HttpHeaders.SET_COOKIE, cookie.toString());
}

@GetMapping("/login/check")
@ResponseStatus(HttpStatus.OK)
public void checkLogin(HttpServletRequest request) {
memberService.checkLogin(request.getCookies());
}


@PostMapping("/logout")
@ResponseStatus(HttpStatus.NO_CONTENT)
public void logout(HttpServletResponse response) {
ResponseCookie cookie = ResponseCookie.from(HttpHeaders.AUTHORIZATION, "")
.maxAge(0)
.path("/")
.secure(true)
.httpOnly(true)
.build();
response.setHeader(HttpHeaders.SET_COOKIE, cookie.toString());
}
}
Loading

0 comments on commit ff5276b

Please sign in to comment.