Spring Security공식 문서에 나온 SecurityFilterChain 작동 방식은 기본적으로 메인 또는 로그인이 필요한 페이지에 접속하게 되면 로그인 정보가 없을때 로그인 페이지로 이동시킨다. 그 후, 아이디 및 비밀번호 입력 후 로그인을 하게 되면 이전 로그인 직전의 페이지로 되돌아간다. 현재 내가 구현하는 기능에서는 이 작동방식이 맞지 않다. 내가 필요한 기능은 로그인 페이지에서 정상 로그인 되면 정해진 특정 페이지로만 이동이 일어나야 한다. 따라서 필요한 추가 코드를 테스트해보고 기록해 둔다.
1. response.sendRedirect() 방법
구간 코드
.formLogin((form) -> form
.loginPage("/login")
.permitAll()
.successHandler((request, response, authentication) -> {
// Redirect to the myhome page after login
response.sendRedirect("/myhome");
})
)
formLogin 밑에 successHandler를 추가하고 response.sendRediret()로 이동시킨다.
전체 코드
package com.example.securingweb;
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.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
import org.springframework.security.web.SecurityFilterChain;
@Configuration
@EnableWebSecurity
public class WebSecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests((requests) -> requests
.requestMatchers("/", "/home").permitAll()
.anyRequest().authenticated()
)
.formLogin((form) -> form
.loginPage("/login")
.permitAll()
.successHandler((request, response, authentication) -> {
// Redirect to the myhome page after login
response.sendRedirect("/myhome");
})
)
.logout((logout) -> logout.permitAll());
return http.build();
}
@Bean
public UserDetailsService userDetailsService() {
UserDetails user =
User.withDefaultPasswordEncoder()
.username("user")
.password("password")
.roles("USER")
.build();
return new InMemoryUserDetailsManager(user);
}
}
2. defaultSuccessUrl() 방법
구간 코드
.formLogin((form) -> form
.loginPage("/login")
.permitAll()
// Redirect to the myhome page after login
.defaultSuccessUrl("/myhome")
)
formLogin 밑에 defaultSuccessUrl을 추가시켜 이동시킨다.
전체 코드
package com.example.securingweb;
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.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
import org.springframework.security.web.SecurityFilterChain;
@Configuration
@EnableWebSecurity
public class WebSecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests((requests) -> requests
.requestMatchers("/", "/home").permitAll()
.anyRequest().authenticated()
)
.formLogin((form) -> form
.loginPage("/login")
.permitAll()
// Redirect to the myhome page after login
.defaultSuccessUrl("/myhome")
)
.logout((logout) -> logout.permitAll());
return http.build();
}
@Bean
public UserDetailsService userDetailsService() {
UserDetails user =
User.withDefaultPasswordEncoder()
.username("user")
.password("password")
.roles("USER")
.build();
return new InMemoryUserDetailsManager(user);
}
}
References
https://spring.io/guides/gs/securing-web/
'알아가기 > Spring' 카테고리의 다른 글
[Spring] 임의의 서버 포트 번호 (random server port number) (0) | 2023.11.18 |
---|---|
[Spring] Advice Types inside AOP (0) | 2023.11.08 |
[Spring] Eager Instantiation Vs Lazy Instantiation (0) | 2023.11.05 |
[Spring] Spring Boot Actuator 사용 (0) | 2023.08.29 |
[Spring] SpringBootServletInitializer 알아보기 (ApplicationContextException: Unable to start 에러 해결) (0) | 2023.08.05 |