SpringSecurity & CRUD & AWS 3 SecurityConfig 생성

kik·2023년 12월 6일
0

security 패키지를 만들고 config 패키지 안에 SecurityConfig 파일을 만들었다.

이 config는 springSecurity 3.xx 버전 부터 사용 가능한 방법이다.
2.xx에서 3.xx로 버전이 업데이트 됐을때 config 작성 방법도 바뀌었기 때문이다.
이 문제 때문에 몇시간 애를 먹었지만 검색 해서 결국 방법을 알아냈다.


import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
import org.springframework.security.web.SecurityFilterChain;

@Configuration
@EnableWebSecurity
public class SecurityConfig {

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        return http
                .csrf(AbstractHttpConfigurer::disable) // 사이트 위변조 요청 방지
                .authorizeHttpRequests((authorizeRequests) -> { // 특정 URL에 대한 권한 설정.
                    authorizeRequests.requestMatchers("/user/**").authenticated();
                    authorizeRequests.requestMatchers("/admin/**")
                            .hasRole("ADMIN"); // ROLE_은 붙이면 안 된다. hasRole()을 사용할 때 자동으로 ROLE_이 붙기 때문이다.
                    authorizeRequests.anyRequest().permitAll();
                })
                .build();
    }
}

config를 이렇게 만들어주고 controller에서

@GetMapping("/admin")
    public @ResponseBody String admin() {
        return "admin";
    }

    @GetMapping("/user")
    public @ResponseBody String user() {
        return "user";
    }

    @GetMapping("/join")
    public @ResponseBody String join() {
        return "join";
    }
    
    @GetMapping("/login")
    public @ResponseBody String login() {
        return "login";
    }

를 작성한 후 실행하면 기본 로그인 화면이 뜨지 않는다.

localhost:8080/admin 이나 /user로 들어가면 권한이 없다고 뜨고
/join으로 들어가면 화면에 join이 잘 뜨게 된다.

이는 config에서 주소창에 user가 붙은 페이지는 user 권한을 가진 사람만 들어갈 수 있게하고 admin이 붙은 페이지는 admin 권한을 가진 사람만 들어갈 수 있도록 설정해 주었기 때문이다.

다시 config를 수정해주었다.


import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
import org.springframework.security.web.SecurityFilterChain;

@Configuration
@EnableWebSecurity
public class SecurityConfig {

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        return http
                .csrf(AbstractHttpConfigurer::disable) // 사이트 위변조 요청 방지
                .authorizeHttpRequests((authorizeRequests) -> { // 특정 URL에 대한 권한 설정.
                    authorizeRequests.requestMatchers("/user/**").authenticated();
                    authorizeRequests.requestMatchers("/admin/**")
                            .hasRole("ADMIN"); // ROLE_은 붙이면 안 된다. hasRole()을 사용할 때 자동으로 ROLE_이 붙기 때문이다.
                    authorizeRequests.anyRequest().permitAll();
                })

                .formLogin((formLogin) -> {
                    formLogin
                            .loginPage("/loginForm"); // 권한이 필요한 요청은 해당 url로 리다이렉트
                })
                .build();
    }
}
.formLogin((formLogin) -> {
                    formLogin
                            .loginPage("/loginForm"); // 권한이 필요한 요청은 해당 url로 리다이렉트
                })

가 추가되었다.

이는 user, admin처럼 권한이 필요한 페이지는 무조건 loginForm 페이지로 이동시키도록 하는 설정이다.

profile
신생아 개발자

0개의 댓글

Powered by GraphCDN, the GraphQL CDN