본문 바로가기
Spring

[Security] 스프링 시큐리티 설치 및 적용

by 서피 2021. 6. 5.

기존의 스프링 프로젝트에 시큐리티를 적용하는 과정이다.

 

1. 시큐리티 의존성

pom.xml에 시큐리티 디펜던시를 추가한다.

org.spring-security-version 값은 mvnrepository를 참고하여 스프링 버전과 호환되는 버전을 선택하였다.

이후 maven 업데이트를 진행한다.

	<properties>
		...
        ...
		<org.spring-security-version>5.3.1.RELEASE</org.spring-security-version>
	</properties>
    
    <dependencies>
		<!-- https://mvnrepository.com/artifact/org.springframework.security/spring-security-config -->
		<dependency>
		    <groupId>org.springframework.security</groupId>
		    <artifactId>spring-security-config</artifactId>
		    <version>${org.spring-security-version}</version>
		</dependency>
				
	
		<!-- https://mvnrepository.com/artifact/org.springframework.security/spring-security-web -->
		<dependency>
		    <groupId>org.springframework.security</groupId>
		    <artifactId>spring-security-web</artifactId>
		    <version>${org.spring-security-version}</version>
		</dependency>
        
        ...
        ...
    </dependencies>
	

 

 

 

- . LogoutSuccessHandler 구현

로그아웃에 성공했을 시 리디렉트하는 핸들러이다.

public class CustomUsLogoutSuccessHandler extends SimpleUrlLogoutSuccessHandler {

	@Override
	public void onLogoutSuccess (HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
		super.onLogoutSuccess(request, response, authentication);
	}
}

 

 

 

 

- . Config 클래스 

WebSecurityConfig 클래스를 생성하고, 어노테이션 및 WebSecurityConfigurerAdapter 상속을 한다.

@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

}

 

LoginAuthenticationFilter 클래스를 생성하고, 인증 메소드를 만든다.

public class LoginAuthenticationFilter extends UsernamePasswordAuthenticationFilter {
	private boolean postOnly = true;
	
	public LoginAuthenticationFilter (AuthenticationManager authenticationManager) {
		super.setAuthenticationManager(authenticationManager);
	}
	
	/*
	 * 사용자 요청으로부터 정보를 가져온 후, Authentication 객체를 인증 프로세스 객체에게 전달
	 */
	@Override
	public Authentication attemptAuthentication (HttpServletRequest request, HttpServletResponse response) {
		
		// post 인지 확인
		if (postOnly && !request.getMethod().equals("POST")) {
			throw new AuthenticationServiceException("POST 방식만 Authentication 가능합니다. " + this.getClass().toString());
		}
		
		String username = obtainUsername(request);
		String password = obtainPassword(request);
		
		if (StringUtils.isEmpty(username))
			username = "";
		if (StringUtils.isEmpty(password))
			password = "";
		
		username = username.trim();
		
		UsernamePasswordAuthenticationToken authRequest = new UsernamePasswordAuthenticationToken(username, password);
		
		setDetails(request, authRequest);
		
		return this.getAuthenticationManager().authenticate(authRequest);
	}
}

 

 

참고자료

https://devuna.tistory.com/59

 

 

 

 

 

 

 

 

 

댓글