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 페이지로 이동시키도록 하는 설정이다.