Skip to content

Commit

Permalink
feat : config μ„€μ • - #10
Browse files Browse the repository at this point in the history
  • Loading branch information
lreowy committed Jan 14, 2025
1 parent 0aae681 commit 02f7e3d
Show file tree
Hide file tree
Showing 3 changed files with 137 additions and 0 deletions.
30 changes: 30 additions & 0 deletions cakey-api/src/main/java/com/cakey/config/RedisConfig.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package com.cakey.config;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;

@Configuration
public class RedisConfig {

@Value("${spring.data.redis.host}")
private String host;

@Value("${spring.data.redis.port}")
private int port;

@Bean
public RedisConnectionFactory redisConnectionFactory() {
return new LettuceConnectionFactory(host, port);
}

@Bean
public RedisTemplate<String, Object> redisTemplate() {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory());
return template;
}
}
78 changes: 78 additions & 0 deletions cakey-api/src/main/java/com/cakey/config/SecurityConfig.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
package com.cakey.config;

import com.cakey.common.auth.CustomAccessDeniedHandler;
import com.cakey.common.auth.CustomJwtAuthenticationEntryPoint;
import com.cakey.common.auth.JwtTokenProvider;
import com.cakey.common.auth.filter.CustomAuthenticationFilter;
import com.cakey.common.auth.filter.JwtAuthenticationFilter;
import lombok.RequiredArgsConstructor;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityCustomizer;
import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;

@Configuration
@EnableWebSecurity
@RequiredArgsConstructor
public class SecurityConfig {

private final JwtAuthenticationFilter jwtAuthenticationFilter;
private final CustomAuthenticationFilter customAuthenticationFilter;
private final CustomAccessDeniedHandler customAccessDeniedHandler;
private final CustomJwtAuthenticationEntryPoint customJwtAuthenticationEntryPoint;
private final JwtTokenProvider jwtTokenProvider;

private static final String[] AUTH_WHITELIST = {
"/actuator/health",
"/api/v1/user/login",
"/token-refresh",
"/api/v1/user/hi",
};

@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
return http.csrf(AbstractHttpConfigurer::disable)
.formLogin(AbstractHttpConfigurer::disable)
.httpBasic(AbstractHttpConfigurer::disable)
.sessionManagement(
session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
.exceptionHandling(
exception -> exception.authenticationEntryPoint(customJwtAuthenticationEntryPoint)
.accessDeniedHandler(customAccessDeniedHandler))
.authorizeHttpRequests(auth -> auth
.requestMatchers(AUTH_WHITELIST).permitAll() // ν™”μ΄νŠΈλ¦¬μŠ€νŠΈ 경둜 ν—ˆμš©
.anyRequest().authenticated())
.addFilterBefore(new JwtAuthenticationFilter(jwtTokenProvider), UsernamePasswordAuthenticationFilter.class)
.addFilterBefore(new CustomAuthenticationFilter(jwtTokenProvider), UsernamePasswordAuthenticationFilter.class)
.build();
}

@Bean
public FilterRegistrationBean<JwtAuthenticationFilter> firstFilterFilterRegistrationBean() {
FilterRegistrationBean<JwtAuthenticationFilter> registrationBean = new FilterRegistrationBean<>();
registrationBean.setFilter(jwtAuthenticationFilter);
registrationBean.addUrlPatterns("/api/v1/user/test1"); // /test1 κ²½λ‘œμ—λ§Œ FirstFilter 적용
registrationBean.setOrder(1); // ν•„ν„° μˆœμ„œ μ„€μ •
return registrationBean;
}

@Bean
public FilterRegistrationBean<CustomAuthenticationFilter> secondFilterFilterRegistrationBean() {
FilterRegistrationBean<CustomAuthenticationFilter> registrationBean = new FilterRegistrationBean<>();
registrationBean.setFilter(customAuthenticationFilter);
registrationBean.addUrlPatterns("/v1/user/test2"); // /test2 κ²½λ‘œμ—λ§Œ SecondFilter 적용
registrationBean.setOrder(2); // ν•„ν„° μˆœμ„œ μ„€μ •
return registrationBean;
}

@Bean
public WebSecurityCustomizer webSecurityCustomizer() {
return web -> web.ignoring().requestMatchers(AUTH_WHITELIST);
}
}
29 changes: 29 additions & 0 deletions cakey-api/src/main/java/com/cakey/config/WebConfig.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package com.cakey.config;

import com.cakey.common.resolver.user.UserIdResolver;
import java.util.List;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@RequiredArgsConstructor
@Configuration
public class WebConfig implements WebMvcConfigurer {

private final UserIdResolver userIdResolver;

@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("GET", "POST", "PUT", "DELETE")
.maxAge(3600);
}

@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
resolvers.add(userIdResolver);
}
}

0 comments on commit 02f7e3d

Please sign in to comment.