Spring Security framework
- 스프링 서버에 필요한 인증 및 인가를 위한 기능을 제공한다.
- build.gradle 코드 추가
// 스프링 시큐리티
implementation 'org.springframework.boot:spring-boot-starter-security'
// Thymeleaf (뷰 템플릿 엔진)
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
- WebSecurityConfig.java 파일 생성
- 에러 발생 (WebSecurityConfigurerAdapter)
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
//WebSecurityConfigurerAdapter는 더이상 사용되지 않는 기능으로 실행 안됨
@Override
protected void configure(HttpSecurity http) throws
Exception {
http.csrf().disable();
http.headers().frameOptions().disable();
http.authorizeRequests()
.antMatchers("/images/**").permitAll()
.antMatchers("/css/**").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/user/login")
.failureUrl("/user/login/error")
.defaultSuccessUrl("/")
.permitAll()
.and()
.logout()
.permitAll();
}
}
- 코드 수정(WebSecurityConfigurerAdapter는 더이상 사용되지 않는 기능이므로 SecurityFilterChain 기능을 사용하는 코드로 변경)
- 참고 포스팅
@RequiredArgsConstructor
@EnableWebSecurity // 스프링 Security 지원을 가능하게 함
@Configuration(proxyBeanMethods = false)
@ConditionalOnDefaultWebSecurity
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
public class WebSecurityConfig {
@Bean
@Order(SecurityProperties.BASIC_AUTH_ORDER)
protected SecurityFilterChain filterChain(HttpSecurity http) throws
Exception {
http.csrf().disable();
http.headers().frameOptions().disable();
http.authorizeRequests()
.antMatchers("/images/**").permitAll()
// image 폴더를 login 인증 없이 허용
.antMatchers("/css/**").permitAll()
// css 폴더를 login 인증 없이 허용
.anyRequest().authenticated()
// 모든 요청에 대해 로그인 인증 필요
//(인증 없을 시 요청 불가, 예: css 파일 요청 등)
.and()
.formLogin()
// 스프링 시큐리티 기본 로그인 기능 제공
.loginPage("/user/login")
//구현한 로그인 페이지 UI로 이동
.failureUrl("/user/login/error")
//구현한 로그인 에러 페이지 UI로 이동
.defaultSuccessUrl("/")
.permitAll()
.and()
.logout()
.permitAll();
return http.build();
}
}
spring.thymeleaf.prefix=classpath:/static/
// thymeleaf 뷰 템플릿 경로를 프로젝트 static 폴더로 지정
@Controller
public class UserController {
// 회원 로그인 페이지
@GetMapping("/user/login")
public String login() {
return "login";
// thymeleaf 뷰 템플릿에 의해 string으로 login을 반환하면
// static 폴더의 login.html이 실행됨
}
@GetMapping("/user/login/error")
public String loginError(Model model) {
model.addAttribute("loginError", true);
return "login";
}
// 회원 가입 페이지
@GetMapping("/user/signup")
public String signup() {
return "signup";
}
}