mirror of
https://git.hmsn.ink/kospo/helptalk/api.git
synced 2026-03-20 00:42:25 +09:00
111 lines
5.0 KiB
Java
111 lines
5.0 KiB
Java
package com.kospo.talk.config.security;
|
|
|
|
import com.kospo.talk.config.filter.AuthenticationFilter;
|
|
import com.kospo.talk.config.filter.CustomBasicAuthenticationFilter;
|
|
import com.kospo.talk.config.filter.SecurityExceptionFilter;
|
|
import com.kospo.talk.repository.UserRepository;
|
|
import com.kospo.talk.service.UserService;
|
|
import jakarta.servlet.http.HttpServletRequest;
|
|
import lombok.RequiredArgsConstructor;
|
|
import org.springframework.context.annotation.Bean;
|
|
import org.springframework.context.annotation.Configuration;
|
|
import org.springframework.security.authentication.AuthenticationManager;
|
|
import org.springframework.security.config.Customizer;
|
|
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
|
|
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.core.Authentication;
|
|
import org.springframework.security.core.AuthenticationException;
|
|
import org.springframework.security.core.session.SessionRegistry;
|
|
import org.springframework.security.core.session.SessionRegistryImpl;
|
|
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
|
|
import org.springframework.security.web.SecurityFilterChain;
|
|
import org.springframework.security.web.access.ExceptionTranslationFilter;
|
|
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
|
|
import org.springframework.security.web.authentication.session.RegisterSessionAuthenticationStrategy;
|
|
import org.springframework.security.web.authentication.session.SessionAuthenticationStrategy;
|
|
import org.springframework.web.cors.CorsConfiguration;
|
|
import org.springframework.web.cors.CorsConfigurationSource;
|
|
|
|
import java.util.Arrays;
|
|
|
|
@Configuration
|
|
@RequiredArgsConstructor
|
|
public class SecurityConfig {
|
|
private final UserService userService;
|
|
|
|
@Bean
|
|
public SecurityFilterChain securityFilterChain(HttpSecurity http,
|
|
UserRepository userRepository) throws Exception {
|
|
http
|
|
.authorizeHttpRequests(authorizationManagerRequestMatcherRegistry -> authorizationManagerRequestMatcherRegistry
|
|
.requestMatchers("/admin*").hasRole("ADMIN")
|
|
.anyRequest().authenticated()
|
|
)
|
|
.csrf(AbstractHttpConfigurer::disable)
|
|
.formLogin(httpSecurityFormLoginConfigurer -> httpSecurityFormLoginConfigurer.disable())
|
|
.addFilterBefore(new CustomBasicAuthenticationFilter(authenticationManager(), userRepository), UsernamePasswordAuthenticationFilter.class)
|
|
.addFilterBefore(new SecurityExceptionFilter(), CustomBasicAuthenticationFilter.class)
|
|
.sessionManagement(httpSecuritySessionManagementConfigurer ->
|
|
httpSecuritySessionManagementConfigurer
|
|
.maximumSessions(1)
|
|
.sessionRegistry(sessionRegistry())
|
|
)
|
|
.cors(httpSecurityCorsConfigurer -> httpSecurityCorsConfigurer.configurationSource(new CorsConfigurationSource() {
|
|
@Override
|
|
public CorsConfiguration getCorsConfiguration(HttpServletRequest request) {
|
|
CorsConfiguration config = new CorsConfiguration();
|
|
String origin = request.getHeader("Origin");
|
|
config.setAllowCredentials(true);
|
|
config.setAllowedOrigins(Arrays.asList("http://kisp.kospo.co.kr:8010", "http://localhost:8010", "http://talk.kospo.co.kr:3000"));
|
|
config.setAllowedMethods(Arrays.asList("POST","GET","DELETE","PUT","OPTIONS"));
|
|
config.setAllowedHeaders(Arrays.asList("*"));
|
|
return config;
|
|
}
|
|
}));
|
|
return http.build();
|
|
}
|
|
|
|
private String getEncoding (String str) {
|
|
BCryptPasswordEncoder b = new BCryptPasswordEncoder();
|
|
return b.encode(str);
|
|
}
|
|
|
|
@Bean
|
|
public SessionRegistry sessionRegistry() {
|
|
return new SessionRegistryImpl();
|
|
}
|
|
|
|
|
|
@Bean
|
|
public AuthenticationManager authenticationManager() {
|
|
AuthenticationManager manager = new AuthenticationManager() {
|
|
@Override
|
|
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
|
|
return authentication;
|
|
}
|
|
};
|
|
return manager;
|
|
}
|
|
|
|
|
|
/*특정 url 필터 제외 처리*/
|
|
@Bean
|
|
public WebSecurityCustomizer webSecurityCustomizer() {
|
|
return (web) -> web.ignoring().requestMatchers(
|
|
"/manifest.json", "/css/**", "/images/**", "/js/**", "/pages/**"
|
|
// -- Swagger UI v2
|
|
, "/v2/api-docs/**", "/swagger-resources/**", "/v3/api-docs/**"
|
|
, "/swagger-ui/**", "/webjars/**", "/swagger/**", "/api-docs/**"
|
|
);
|
|
}
|
|
|
|
|
|
@Bean
|
|
public SessionAuthenticationStrategy sessionAuthenticationStrategy() {
|
|
return new RegisterSessionAuthenticationStrategy(sessionRegistry());
|
|
}
|
|
}
|
|
|