-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Feature: security 관련 Bean 추가 구현
- Loading branch information
Showing
11 changed files
with
261 additions
and
1 deletion.
There are no files selected for viewing
11 changes: 11 additions & 0 deletions
11
cakk-api/src/main/java/com/cakk/api/annotation/SignInUser.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
package com.cakk.api.annotation; | ||
|
||
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 SignInUser { | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
18 changes: 18 additions & 0 deletions
18
cakk-api/src/main/java/com/cakk/api/config/WebMvcConfig.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
package com.cakk.api.config; | ||
|
||
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 com.cakk.api.resolver.AuthorizedUserResolver; | ||
|
||
@Configuration | ||
public class WebMvcConfig implements WebMvcConfigurer { | ||
|
||
@Override | ||
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) { | ||
resolvers.add(new AuthorizedUserResolver()); | ||
} | ||
} |
59 changes: 59 additions & 0 deletions
59
cakk-api/src/main/java/com/cakk/api/factory/OidcProviderFactory.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,59 @@ | ||
package com.cakk.api.factory; | ||
|
||
import java.util.EnumMap; | ||
import java.util.Map; | ||
|
||
import org.springframework.stereotype.Component; | ||
|
||
import com.cakk.api.provider.oauth.OidcProvider; | ||
import com.cakk.api.provider.oauth.impl.AppleAuthProvider; | ||
import com.cakk.api.provider.oauth.impl.GoogleAuthProvider; | ||
import com.cakk.api.provider.oauth.impl.KakaoAuthProvider; | ||
import com.cakk.common.enums.Provider; | ||
import com.cakk.common.enums.ReturnCode; | ||
import com.cakk.common.exception.CakkException; | ||
|
||
@Component | ||
public class OidcProviderFactory { | ||
|
||
private final Map<Provider, OidcProvider> authProviderMap; | ||
private final AppleAuthProvider appleAuthProvider; | ||
private final KakaoAuthProvider kakaoAuthProvider; | ||
private final GoogleAuthProvider googleAuthProvider; | ||
|
||
public OidcProviderFactory( | ||
AppleAuthProvider appleAuthProvider, | ||
KakaoAuthProvider kakaoAuthProvider, | ||
GoogleAuthProvider googleAuthProvider | ||
) { | ||
authProviderMap = new EnumMap<>(Provider.class); | ||
|
||
this.appleAuthProvider = appleAuthProvider; | ||
this.kakaoAuthProvider = kakaoAuthProvider; | ||
this.googleAuthProvider = googleAuthProvider; | ||
|
||
initialize(); | ||
} | ||
|
||
private void initialize() { | ||
authProviderMap.put(Provider.APPLE, appleAuthProvider); | ||
authProviderMap.put(Provider.KAKAO, kakaoAuthProvider); | ||
authProviderMap.put(Provider.GOOGLE, googleAuthProvider); | ||
} | ||
|
||
public String getProviderId(Provider provider, String idToken) { | ||
return getProvider(provider).getProviderId(idToken); | ||
} | ||
|
||
private OidcProvider getProvider(Provider provider) { | ||
OidcProvider oidcProvider = authProviderMap.get(provider); | ||
|
||
if (oidcProvider == null) { | ||
throw new CakkException(ReturnCode.WRONG_PROVIDER); | ||
} | ||
|
||
return oidcProvider; | ||
} | ||
} | ||
|
||
|
69 changes: 69 additions & 0 deletions
69
cakk-api/src/main/java/com/cakk/api/filter/JwtAuthenticationFilter.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,69 @@ | ||
package com.cakk.api.filter; | ||
|
||
import java.io.IOException; | ||
import java.util.Optional; | ||
|
||
import jakarta.servlet.FilterChain; | ||
import jakarta.servlet.ServletException; | ||
import jakarta.servlet.http.HttpServletRequest; | ||
import jakarta.servlet.http.HttpServletResponse; | ||
|
||
import org.springframework.beans.factory.annotation.Value; | ||
import org.springframework.security.core.Authentication; | ||
import org.springframework.security.core.context.SecurityContextHolder; | ||
import org.springframework.stereotype.Component; | ||
import org.springframework.web.filter.OncePerRequestFilter; | ||
|
||
import com.cakk.api.provider.jwt.JwtProvider; | ||
import com.cakk.common.enums.ReturnCode; | ||
import com.cakk.common.exception.CakkException; | ||
|
||
@Component | ||
public class JwtAuthenticationFilter extends OncePerRequestFilter { | ||
|
||
private final JwtProvider jwtProvider; | ||
private final String accessHeader; | ||
private final String grantType; | ||
|
||
public JwtAuthenticationFilter( | ||
JwtProvider jwtProvider, | ||
|
||
@Value("${jwt.access-header}") String accessHeader, | ||
|
||
@Value("${jwt.grant-type}") String grantType | ||
) { | ||
this.jwtProvider = jwtProvider; | ||
this.accessHeader = accessHeader; | ||
this.grantType = grantType; | ||
} | ||
|
||
@Override | ||
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws | ||
ServletException, | ||
IOException { | ||
Optional<String> token = getTokensFromHeader(request, accessHeader); | ||
|
||
token.ifPresent(it -> { | ||
String accessToken = replaceBearerToBlank(it); | ||
|
||
Authentication authentication = jwtProvider.getAuthentication(accessToken); | ||
SecurityContextHolder.getContext().setAuthentication(authentication); | ||
}); | ||
|
||
filterChain.doFilter(request, response); | ||
} | ||
|
||
private Optional<String> getTokensFromHeader(HttpServletRequest request, String header) { | ||
return Optional.ofNullable(request.getHeader(header)); | ||
} | ||
|
||
private String replaceBearerToBlank(String token) { | ||
String suffix = grantType + " "; | ||
|
||
if (!token.startsWith(suffix)) { | ||
throw new CakkException(ReturnCode.NOT_EXIST_BEARER_SUFFIX); | ||
} | ||
|
||
return token.replace(suffix, ""); | ||
} | ||
} |
50 changes: 50 additions & 0 deletions
50
cakk-api/src/main/java/com/cakk/api/filter/JwtExceptionFilter.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,50 @@ | ||
package com.cakk.api.filter; | ||
|
||
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.http.HttpStatus; | ||
import org.springframework.stereotype.Component; | ||
import org.springframework.web.filter.OncePerRequestFilter; | ||
|
||
import com.fasterxml.jackson.core.JsonProcessingException; | ||
import com.fasterxml.jackson.databind.ObjectMapper; | ||
|
||
import com.cakk.common.enums.ReturnCode; | ||
import com.cakk.common.exception.CakkException; | ||
import com.cakk.common.response.ApiResponse; | ||
|
||
@Component | ||
public class JwtExceptionFilter extends OncePerRequestFilter { | ||
|
||
@Override | ||
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws | ||
ServletException, | ||
IOException { | ||
try { | ||
filterChain.doFilter(request, response); | ||
} catch (CakkException exception) { | ||
setErrorResponse(exception.getReturnCode(), response); | ||
} | ||
} | ||
|
||
private void setErrorResponse(ReturnCode returnCode, HttpServletResponse response) { | ||
response.setStatus(HttpStatus.UNAUTHORIZED.value()); | ||
response.setContentType("application/json; charset=UTF-8"); | ||
ApiResponse<String> result = ApiResponse.fail(returnCode); | ||
|
||
try { | ||
response.getWriter().write(toJson(result)); | ||
} catch (IOException e) { | ||
// ignored | ||
} | ||
} | ||
|
||
private String toJson(Object data) throws JsonProcessingException { | ||
return new ObjectMapper().writeValueAsString(data); | ||
} | ||
} |
31 changes: 31 additions & 0 deletions
31
cakk-api/src/main/java/com/cakk/api/resolver/AuthorizedUserResolver.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
package com.cakk.api.resolver; | ||
|
||
import static java.util.Objects.*; | ||
|
||
import org.springframework.core.MethodParameter; | ||
import org.springframework.security.core.context.SecurityContextHolder; | ||
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 com.cakk.api.annotation.SignInUser; | ||
import com.cakk.api.vo.OAuthUserDetails; | ||
import com.cakk.domain.entity.user.User; | ||
|
||
public class AuthorizedUserResolver implements HandlerMethodArgumentResolver { | ||
@Override | ||
public boolean supportsParameter(MethodParameter parameter) { | ||
return parameter.hasParameterAnnotation(SignInUser.class) | ||
&& User.class.isAssignableFrom(parameter.getParameterType()); | ||
} | ||
|
||
@Override | ||
public User resolveArgument(MethodParameter parameter, | ||
ModelAndViewContainer mavContainer, | ||
NativeWebRequest webRequest, | ||
WebDataBinderFactory binderFactory) throws Exception { | ||
OAuthUserDetails userDetails = (OAuthUserDetails)SecurityContextHolder.getContext().getAuthentication().getPrincipal(); | ||
return isNull(userDetails) ? null : userDetails.getUser(); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters