1. EmailConfig
- 이메일 인증을 위해 구현한 설정
@Configuration
public class EmailConfig {
@Value("${spring.mail.host}")
private String host;
@Value("${spring.mail.port}")
private int port;
@Value("${spring.mail.username}")
private String username;
@Value("${spring.mail.password}")
private String password;
@Value("${spring.mail.properties.mail.smtp.auth}")
private boolean auth;
@Value("${spring.mail.properties.mail.smtp.starttls.enable}")
private boolean starttlsEnable;
@Value("${spring.mail.properties.mail.smtp.starttls.required}")
private boolean starttlsRequired;
@Value("${spring.mail.properties.mail.smtp.connectiontimeout}")
private int connectionTimeout;
@Value("${spring.mail.properties.mail.smtp.timeout}")
private int timeout;
@Value("${spring.mail.properties.mail.smtp.writetimeout}")
private int writeTimeout;
@Bean
public JavaMailSender javaMailSender() {
JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
mailSender.setHost(host);
mailSender.setPort(port);
mailSender.setUsername(username);
mailSender.setPassword(password);
mailSender.setDefaultEncoding("UTF-8");
mailSender.setJavaMailProperties(getMailProperties());
return mailSender;
}
private Properties getMailProperties() {
Properties properties = new Properties();
properties.put("mail.transport.protocol","smtp");//프로토콜로 smtp 사용
properties.put("mail.smtp.auth", auth);
properties.put("mail.smtp.starttls.enable", starttlsEnable);
properties.put("mail.smtp.starttls.required", starttlsRequired);
properties.put("mail.smtp.connectiontimeout", connectionTimeout);
properties.put("mail.smtp.timeout", timeout);
properties.put("mail.smtp.writetimeout", writeTimeout);
return properties;
}
}
2. EncrypterConfig
- 비밀번호를 암호화에 필요한 설정
@Configuration
@EnableWebSecurity
public class EncrypterConfig {
//비밀번호를 암호화하는데 사용할 수 있는 메서드를 가진 클래스
@Bean
public BCryptPasswordEncoder encoder(){
return new BCryptPasswordEncoder();
}
}
3. SecurityConfig
- 권한 별로 접근 가능한 url 설정
- 로그인 관련 시큐리티 설정
@Configuration
@EnableWebSecurity
@RequiredArgsConstructor
public class SecurityConfig {
private final MemberRepository memberRepository;
//로그인하지 않은 유저들만 접근 가능한 URL
private static final String[] anonymousMemberUrl = {"/members/login","/members/join"};
//로그인한 유저들만 접근 가능한 URL
private static final String[] authenticatedMemberUrl = {"/members/myPage/**","/orders/**","/reviews/**/write","/qna/**/write","/orders/**"};
//관리자만 접근 가능한 URL
private static final String[] authenticatedAdminUrl = {"/admins/**","/items/create","/items/edit","/items/delete"};
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity httpSecurity) throws Exception{
return httpSecurity
.csrf((csrfConfig)->
csrfConfig.disable()
)
.authorizeHttpRequests((authorizeRequests)->
authorizeRequests
.requestMatchers(anonymousMemberUrl).anonymous()
//authenticatedUserUrl에 대해서는 로그인을 요구
.requestMatchers(authenticatedMemberUrl).authenticated()
//해당 url에 대해서는 admin 권한을 갖고 있어야 접근 가능
.requestMatchers(authenticatedAdminUrl).hasAuthority("ADMIN")
//나머지 요청에 대해서는 로그인을 요구하지 않음
.anyRequest().permitAll()
)
.exceptionHandling((exceptionConfig)->
exceptionConfig
.accessDeniedHandler(new MyAccessDeniedHandler(memberRepository)) //인가 실패
.authenticationEntryPoint(new MyAuthenticationEntryPoint()) //인증 실패
) //로그인한 멤버만 접근할 수 있는 url에 로그인하지 않은 사용자가 접근할 경우
.formLogin((formLogin)->
formLogin
//로그인 페이지를 제공하는 url을 설정
.loginPage("/members/login")
//로그인에 사용될 id
.usernameParameter("email")
//로그인에 사용될 password
.passwordParameter("password")
//로그인 성공시 실행될 handler
.successHandler(new MyLoginSuccessHandler(memberRepository))
//로그인 실패시 redirect 될 URL => 실패 메세지 출력
.failureUrl("/members/login?fail")
)
.logout((logoutConfig)->
logoutConfig
.logoutUrl("/members/logout")
.invalidateHttpSession(true).deleteCookies("JSESSIONID")
.logoutSuccessHandler(new MyLogoutSuccessHandler())
)
.build();
}
}
4. webConfig
- 허용할 Http 메소드 설정
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry){
registry.addMapping("/**")
.allowedOrigins("http://localhost:8080")
.allowedMethods("GET", "POST", "PUT", "DELETE");
}
}
'web > Bakery Shop Project' 카테고리의 다른 글
쇼핑몰 구현 9 - 상품 기능 (0) | 2024.02.23 |
---|---|
쇼핑몰 구현 8 - 회원 기능 (0) | 2024.02.23 |
쇼핑몰 구현 6 - 라이브러리 설치, Entity 생성 (0) | 2024.02.23 |
쇼핑몰 구현 5 - 설계 & 결과 (0) | 2024.02.22 |
쇼핑몰 구현 4 - API 엔드포인트 설계 (0) | 2024.01.31 |