본문 바로가기
web/Bakery Shop Project

쇼핑몰 구현 7 - 환경설정

by su0a 2024. 2. 23.

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");
    }
}