package com.sparta.myselectshop.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
@Configuration // 아래 설정을 등록하여 활성화 합니다.
@EnableJpaAuditing // 시간 자동 변경이 가능하도록 합니다.
public class JpaConfig {
}
@Configuration : 자바 기반 설정 클래스를 표시하는데 사용된다. spring 애플리케이션의 설정을 포함하고 , 빈의 생성 및 관리를 담당하는 역할
@EnableJpaAuditing : JPA 엔티티에 대한 감시 설정을 활성화 한다. 엔티티의 생성일자, 수정일자 등을 자동으로 관리하기 위해 사용된다.
@Configuration
@EnableWebSecurity // Spring Security 지원을 가능하게 함
@RequiredArgsConstructor
public class WebSecurityConfig {
private final JwtUtil jwtUtil;
private final UserDetailsServiceImpl userDetailsService;
private final AuthenticationConfiguration authenticationConfiguration;
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
@Bean
public AuthenticationManager authenticationManager(AuthenticationConfiguration configuration) throws Exception {
return configuration.getAuthenticationManager();
}
@Bean
public JwtAuthenticationFilter jwtAuthenticationFilter() throws Exception {
JwtAuthenticationFilter filter = new JwtAuthenticationFilter(jwtUtil);
filter.setAuthenticationManager(authenticationManager(authenticationConfiguration));
return filter;
}
@Bean
public JwtAuthorizationFilter jwtAuthorizationFilter() {
return new JwtAuthorizationFilter(jwtUtil, userDetailsService);
}
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
// CSRF 설정
http.csrf((csrf) -> csrf.disable());
// 기본 설정인 Session 방식은 사용하지 않고 JWT 방식을 사용하기 위한 설정
http.sessionManagement((sessionManagement) ->
sessionManagement.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
);
http.authorizeHttpRequests((authorizeHttpRequests) ->
authorizeHttpRequests
.requestMatchers(PathRequest.toStaticResources().atCommonLocations()).permitAll() // resources 접근 허용 설정
.requestMatchers("/").permitAll() // 메인 페이지 요청 허가
.requestMatchers("/api/user/**").permitAll() // '/api/user/'로 시작하는 요청 모두 접근 허가
.anyRequest().authenticated() // 그 외 모든 요청 인증처리
);
http.formLogin((formLogin) ->
formLogin
.loginPage("/api/user/login-page").permitAll()
);
// 필터 관리
http.addFilterBefore(jwtAuthorizationFilter(), JwtAuthenticationFilter.class);
http.addFilterBefore(jwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class);
return http.build();
}
}
-@WebSecurityConfig : Spring Security를 설정하는 데 사용된다. Spring Security 사용하여 애플리케이션의 보안 요구 사항을 처리하고 있다.
public class UserDetailsImpl implements UserDetails {
private final User user;
public UserDetailsImpl(User user) {
this.user = user;
}
public User getUser() {
return user;
}
@Override
public String getPassword() {
return user.getPassword();
}
@Override
public String getUsername() {
return user.getUsername();
}
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
UserRoleEnum role = user.getRole();
String authority = role.getAuthority();
SimpleGrantedAuthority simpleGrantedAuthority = new SimpleGrantedAuthority(authority);
Collection<GrantedAuthority> authorities = new ArrayList<>();
authorities.add(simpleGrantedAuthority);
return authorities;
}
@Override
public boolean isAccountNonExpired() {
return true;
}
@Override
public boolean isAccountNonLocked() {
return true;
}
@Override
public boolean isCredentialsNonExpired() {
return true;
}
@Override
public boolean isEnabled() {
return true;
}
}
Spring Security에서 사용자 정보를 제공하는 UserDetails 인터페이스의 구현체인 UserDetailsImpl 클래스이다. 주로 사용자의 인증 정보를 담고 있는 객체를 Spring Security에 제공하기 위해 구현한다.
UserDetailsImpl(User user): UserDetailsImpl 생성자로 주어진 User 객체를 이용하여 사용자 정보를 초기화한다.
getPassword(): Spring Security의 UserDetails 인터페이스에 정의된 메서드로, 사용자의 비밀번호를 반환한다. 보통은 User 객체에서 비밀번호를 가져와 반환한다.
getUsername(): 마찬가지로 UserDetails 인터페이스에 정의된 메서드로, 사용자의 이름(또는 아이디)를 반환한다.
getAuthorities(): 사용자의 권한 정보를 제공한다. 보통은 User 객체에 정의된 역할 정보를 이용하여 GrantedAuthority를 생성하고 이를 컬렉션으로 반환한다.
isAccountNonExpired(), isAccountNonLocked(), isCredentialsNonExpired(), isEnabled(): 각각 사용자 계정의 만료 여부, 잠금 여부, 자격 증명의 만료 여부, 사용 가능 여부를 반환한다. 일반적으로 true로 설정하여 계정의 유효성을 확인한다.
UserDetailsImpl(User user)
- 이 클래스가 UserDetails 인터페이스를 구현하여 Spring Security에 의해 요구되는 사용자 정보를 제공한다는 것을 의미한다. Spring Security는 사용자 인증 및 권한 부여를 수행하는데, 이를 위해서는 사용자 정보를 정확하게 알아야 한다. UserDetails 인터페이스를 구현한 클래스가 필요하다.
- 클래스가 제공하는 메서드들이 Spring Security에 의해 사용되어 사용자 정보를 올바르게 처리하고, 사용자를 인증하고 권한을 관리할 수 있게 도와준다 이 클래스는 Spring Security에 의해 호출되어 인증 및 권한 관리에 필요한 사용자 정보를 제공하고, Spring Security가 이 정보를 활용하여 인증 및 권한 부여 작업을 수행할 수 있도록 한다.