알아가기/Spring

[Spring] SecurityFilterChain 로그인 후 특정 주소로 이동

XEV 2023. 8. 30. 23:46

 

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/

 

Getting Started | Securing a Web Application

Suppose that you want to prevent unauthorized users from viewing the greeting page at /hello. As it is now, if visitors click the link on the home page, they see the greeting with no barriers to stop them. You need to add a barrier that forces the visitor

spring.io