코드 그라데이션
JWT 예제 구현 (5) 5개의 클래스를 SecurityConfig에 적용 본문
SecurityConfig.java
package inflearn.freejwt.config;
import inflearn.freejwt.jwt.JwtAccessDeniedHandler;
import inflearn.freejwt.jwt.JwtAuthenticationEntryPoint;
import inflearn.freejwt.jwt.JwtSecurityConfig;
import inflearn.freejwt.jwt.TokenProvider;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Bean;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.builders.WebSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
import org.springframework.web.filter.CorsFilter;
@EnableWebSecurity // 기본적인 웹 시큐리티 설정을 활성화하겠다.
// 추가적 설정을 위해서 WebSecurityConfigurer 을 implement 하거나
// WebSecurityConfigureAdapter 를 extends 하는 방법이 있다.
@EnableGlobalMethodSecurity(prePostEnabled = true) // @PreAuthorize 어노테이션을 메서드 단위로 추가하기 위해서 사용
@RequiredArgsConstructor
public class SecurityConfig extends WebSecurityConfigurerAdapter {
// 추가
private final TokenProvider tokenProvider;
private final CorsFilter corsFilter;
private final JwtAuthenticationEntryPoint jwtAuthenticationEntryPoint;
private final JwtAccessDeniedHandler jwtAccessDeniedHandler;
// 추가
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
/**
* h2-console 하위 모든 요청들과 파비콘 관련 요청은
* Spring Security 로직을 수행하지 않고 접근할 수 있게 configure 메서드를 오버라이드해서 내용을 추가해준다.
*/
@Override
public void configure(WebSecurity web) {
web.ignoring()
.antMatchers(
"/h2-console/**"
,"/favicon.ico"
,"/error" // 추가
);
}
// 추가
/**
*
* @param http the {@link HttpSecurity} to modify
* @throws Exception
*
* 많은 부분들을 추가
* : 토큰을 사용하기 때문에 csrf 설정은 disable
* Exception을 핸들링할 때 만들었던 클래스들을 추가한다.
*/
@Override
protected void configure(HttpSecurity http) throws Exception {
// token을 사용하는 방식이기 때문에 csrf를 disable한다.
http.csrf().disable()
.addFilterBefore(corsFilter, UsernamePasswordAuthenticationFilter.class)
.exceptionHandling()
.authenticationEntryPoint(jwtAuthenticationEntryPoint)
.accessDeniedHandler(jwtAccessDeniedHandler)
// h2-console을 위한 설정
.and()
.headers()
.frameOptions()
.sameOrigin()
.and()
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS) // session을 사용하지 않음.
.and()
.authorizeRequests() // HttpServletRequest를 사용하는 요청들에 대한 접근 제한을 설정하겠다.
.antMatchers("/api/hello").permitAll() // /api/hello 에 대한 요청은 인증 없이 접근을 허용하겠다.
.antMatchers("/api/authenticate").permitAll()
.antMatchers("/api/signup").permitAll()
.anyRequest().authenticated() // 나머지 요청들에 대해서는 인증을 받아야 한다.
.and()
.apply(new JwtSecurityConfig(tokenProvider));
}
}
JwtSecurityConfig
package inflearn.freejwt.jwt;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.SecurityConfigurerAdapter;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.web.DefaultSecurityFilterChain;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
/**
* TokenProvider, JwtFilter를 SecurityConfig에 적용할 때 사용할 클래스
*/
// 어노테이션 3개 추가
@Configuration
@EnableWebSecurity
@RequiredArgsConstructor
public class JwtSecurityConfig extends SecurityConfigurerAdapter<DefaultSecurityFilterChain, HttpSecurity> {
private final TokenProvider tokenProvider; // 추가
// private TokenProvider tokenProvider; 제거
@Override
public void configure(HttpSecurity http) throws Exception {
JwtFilter customFilter = new JwtFilter(tokenProvider);
http.addFilterBefore(customFilter, UsernamePasswordAuthenticationFilter.class);
}
}
728x90
'Spring > Security' 카테고리의 다른 글
JWT 예제 구현 (7) 회원가입, 권한 검증 로직 (0) | 2023.12.13 |
---|---|
JWT 예제 구현 (6) Dto, Repository, UserDetailsService 구현 인터페이스 (0) | 2023.12.12 |
JWT 예제 구현 (4) JWT 기본 코드 구현 + Security 설정 추가 (1) | 2023.12.11 |
JWT 예제 구현 (3) SecurityConfig 추가, 기본 엔티티 구현 (0) | 2023.12.09 |
JWT 예제 구현 (2) 권한 에러 해결, 데이터베이스 연결 (1) | 2023.12.09 |
Comments