signup 페이지를 들어가야하는데 login 페이지만 반환된다
localhost:8080/api/user/signup URL을 통해서 회원가입 요청을 하고자했으나, localhost:8080/login으로 강제 redirect 시킨다. 분명히 Controller들을 확인하는데 로그조차도 나타나지 않는다.
@Controller
@RequestMapping("/api")
public class UserController {
private final UserService userService;
//redirect문제가생겨서 잠시 로거사용
private static final Logger logger = LoggerFactory.getLogger(UserController.class);
public UserController(UserService userService) {
this.userService = userService;
}
@GetMapping("/user/login-page")
public String loginPage() {
return "login";
}
@GetMapping("/user/signup")
public String signupPage() {
return "signup";
}
@PostMapping("/user/signup")
public String signup(SignupRequestDto requestDto){
userService.signup(requestDto);
//redirect문제가생겨서 잠시 로거사용 -> 로그가 안남는것 보니 Spring Security 관련 문제라고함 SecurityConfig로 수동 설정
String redirectPath = "redirect:/api/user/login-page";
logger.info("Redirecting to: " + redirectPath);
return redirectPath;
}
}
Java
복사
ChatGPT는 리빌드, 빌드캐시 삭제까지 진행했는데 안되자 Spring Security의 인증 요청의 문제일 것이라고 한다. 따라서 아래 SecurityConfig 클래스를 오버라이드를 통해 권한을 재설정하고자했다.
SpringBoot 2.6.x ~ Spring Security의 SecurityConfig 커스텀
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.configuration.WebSecurityConfigurerAdapter;
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/api/user/signup").permitAll() // 회원가입 페이지에는 인증 없이 접근 허용
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/api/user/login-page") // 커스텀 로그인 페이지 경로 지정
.permitAll()
.and()
.logout()
.logoutUrl("/api/user/logout") // 로그아웃 URL 지정
.permitAll();
}
}
Java
복사
하지만 WebSecurityConfigurerAdapter 클래스를 읽어오지 못한다. 이것은 SpringBoot 2버전대의 코드라고한다. 3.1.x~ 버전들은 다음과 같은 코드로 변경되었다고한다. 특히 WebSecurityConfigurerAdapter 자체를 사용하지 않아서 크게 변경된 것 중 하나로 보여진다.
@Configuration
@EnableWebSecurity
@EnableMethodSecurity
@RequiredArgsConstructor
public class SecurityConfig {
private final CorsFilter corsFilter;
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.csrf(AbstractHttpConfigurer::disable)
.addFilterBefore(corsFilter, UsernamePasswordAuthenticationFilter.class)
.sessionManagement(session -> session
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
)
.authorizeHttpRequests(request -> request
.requestMatchers(
"/version", "/login/google"
)
.permitAll()
)
.authorizeHttpRequests(request -> request.anyRequest().authenticated())
return http.build();
}
}
Java
복사
이것도 한두개씩 주입을 못한다. 대체 뭐가 문제일까?
이것저것 다뒤져봤지만 결국 쉽게 끝났다.
Using generated security password 를 계속 생성한다. Security가 AutoConfiguration 되면서 생성하는 것은 맞았다. 하지만, 직접 오버라이딩으로 수정 하는 것 보다 실수를 먼저 찾았어야 했다.(모든 파일을 다뒤졌는데 숨은것을 못발견했었다..)
문제는 Application 시작부였다. (exclude = SecurityAutoConfiguration.class)
package com.yzpocket.blog;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
@EnableJpaAuditing
@SpringBootApplication(exclude = SecurityAutoConfiguration.class)
public class BlogApplication {
public static void main(String[] args) {
SpringApplication.run(BlogApplication.class, args);
}
}
Java
복사
@SpringBootApplication(exclude = SecurityAutoConfiguration.class) 어노테이션에 옵션을 주었어야 했는데
@ConditionalOnMissingBean에는 아래 3개가 있어야하는데, 없기 때문에 임시비밀번호를 계속 생성하던 것이었다.
AuthenticationManager.class
AuthenticationProvider.class
UserDetailsService.class
Security를 쓴다는건 인증을 허가하는 부분이 있어야 하는데 구현되어 있지 않아서 계속 인증을 요구하던 것이었다.
이 부분은 바로 후속 강의 Spring Security를 통해 그 원인을 찾아냈다.
Spring Security는 Form Login 을 통해 기본적인 인증이 필요한 URL요청에 대해서 자체 로그인 페이지를 반환하던 문제였다.
임시 비밀번호가 활성화되어도 이미 Bcrypt 암호화가 Bean으로 등록되어 해당 비밀번호를 인식하지 못하는 문제였다.