Blog

[Spring]32 View페이지가 계속 나타나는 Using generated security password? - Spring Security Form Login 기반 인증

Author
Summary
Auth 인증 요구로 인해 페이지 접근이 되지 않는다.
Category
Study
Tags
Spring
Favorite
Memory Date
2023/09/05
Cross Reference Study
Related Media
Related Thought
Related Lessons
tag
날짜
작성자
진행상황
진행 전
태그구분
6 more properties
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으로 등록되어 해당 비밀번호를 인식하지 못하는 문제였다.