[백업][가리사니] spring boot security : 4. 인증 페이지뷰
java, spring

이 문서는 가리사니 개발자 포럼에 올렸던 글의 백업 파일입니다. 오래된 문서가 많아 현재 상황과 맞지 않을 수 있습니다.

Spring boot Security 시리즈

서론

앞서 2강에서 만든 /login에 뷰를 붙여보도록 하겠습니다. 이 강의에선 뷰로 타임리프를 써보도록하겠습니다. 타임리프 : http://www.thymeleaf.org/

메이븐 추가 - 타임리프

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
	<groupId>org.thymeleaf.extras</groupId>
	<artifactId>thymeleaf-extras-springsecurity4</artifactId>
</dependency>

SecurityConfig 변경

주의 : new BCryptPasswordEncoder() 로 실습을 할 예정임으로 저번강의의 DB 암호는 아래결과로 교체해주세요.

new BCryptPasswordEncoder().encode("암호");
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter
{
	@Override
	public void configure(WebSecurity web) throws Exception
	{
		// 메인페이지 : css나 js 같은것들도 여기에 포함시켜준다.
		web.ignoring()
			.antMatchers("/");
	}

	@Override
	protected void configure(HttpSecurity http) throws Exception
	{
		http.authorizeRequests()
			.antMatchers("/login").permitAll()
			.antMatchers("/**").authenticated();

		http
			.formLogin()
			// 로그인 처리 페이지 : 지난 강의에선 /login 이였지만
			// 이번엔 직접 작성한 뷰를 보여줄 것이기 때문에 사용자에게
			// login 이라는 화면을 보여주는게 더 깔끔할 것 같아서 교체함!
			.loginProcessingUrl("/loginProcessing")
			// 로그인 페이지
			.loginPage("/login")
			// 로그인 실패 페이지
			.failureUrl("/login?error");

		http
			.logout()
			// /logout 을 호출할 경우 로그아웃
			.logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
			// 로그아웃이 성공했을 경우 이동할 페이지
			.logoutSuccessUrl("/");
	}

	@Configuration
	public static class AuthenticationConfiguration extends GlobalAuthenticationConfigurerAdapter
	{
		@Autowired
		UserDetailsService userDetailsService;

		@Bean
		PasswordEncoder passwordEncoder()
		{
			// 인증에 기본 스프링 해시를 사용하겠습니다.
			return new BCryptPasswordEncoder();
		}

		@Override
		public void init(AuthenticationManagerBuilder auth) throws Exception
		{
			auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
		}
	}
}

템플릿

src/main/resources/templates/login.html

<!DOCTYPE html>
<html xmlns:th="http://www.typeleaf.org">
<head>
	<meta charset="utf-8"/>
	<title>로그인</title>
</head>
<body>
<div>

	<h1>로그인을 해봅시다.!!</h1>

	<form th:action="@{/loginProcessing}" method="post">
		<h2>로그인 폼</h2>

		<!-- 파라미터 error가 있는경우 IF 통과 -->
		<div th:if="${param.error}">
			잘못된 아이디나 암호입니다.
		</div>

		<input type="text" name="username" placeholder="계정" required="required"/>
		<input type="password" name="password" placeholder="암호" required="required"/>
		<input type="submit" value="로그인"/>
	</form>

</div>
</body>
</html>

컨트롤러

@RequestMapping("/login")
String login()
{
	// 타임리프의 뷰.
	// 타임리프의 뷰는 기본값으로 resources/templates/<경로>.html 이다.
	// 즉 이렇게하면 resources/templates/login.html 이 불린다.
	return "login";
}

정상적으로 실행되셨다면 성공!!