Spring Boot에 Spring Security 적용하기 (Spring Security Java Config)
Spring Boot에 Spring Security를 적용하기 위해서 할 일은 Spring Security Library를 추가(라이브러리를 classpath에 추가) 하기만 하면 된다.
초기 프로젝트 생성 시에 다음과 같이 라이브러리를 추가해주었다.
dependencies {
....
implementation 'org.springframework.boot:spring-boot-starter-security'....
}
Spring Security가 적용되면 기본 설정이 적용되어 모든 HTTP endpoints의 접근에 인증을 해야 한다.
기본적인 설정으로는 사용할 수 없기 때문에 설정을 변경해 줘야 한다.
package com.quickguide.backend.config;
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;
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;
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.csrf().disable()
.authorizeRequests()
.antMatchers("/", "/home").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.loginProcessingUrl("/auth/login")
.usernameParameter("username")
.passwordParameter("password")
.permitAll()
.and()
.logout()
.permitAll();
}
@Bean
@Override
public UserDetailsService userDetailsService() {
UserDetails user = User.withDefaultPasswordEncoder()
.username("user")
.password("password")
.roles("USER")
.build();
return new InMemoryUserDetailsManager(user);
}
}
WebSecurityConfigurerAdapter의 configure, userDetailService 메소드를 Override 하여 설정을 변경한다.
loginPage() 메소드는 커스텀 로그인 페이지를 의미한다. 그렇기 때문에 커스텀 로그인 페이지를 생성해줘야 한다.
(기존에 디폴트로 제공되는 로그인 페이지와는 다른 것 같다.)
application.properties에 다음과 같이 추가한다.
#Web MVC Configuration
spring.mvc.view.prefix: /WEB-INF/jsp/
spring.mvc.view.suffix: .jsp
src/webapp/WEB-INF/jsp/login.jsp 를 경로까지 생성해준다.
login.jsp 페이지
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="description" content="">
<meta name="author" content="">
<title>Please sign in</title>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-/Y6pD6FV/Vv2HJnA6t+vslU6fwYXjCFtcEpHbNJ0lyAFsXTsjBbfaDjzALeQsN6M" crossorigin="anonymous">
<link href="https://getbootstrap.com/docs/4.0/examples/signin/signin.css" rel="stylesheet" crossorigin="anonymous"/>
</head>
<body>
<div class="container">
<form class="form-signin" method="post" action="/auth/login">
<h2 class="form-signin-heading">Please sign in</h2>
<p>
<label for="username" class="sr-only">Username</label>
<input type="text" id="username" name="username" class="form-control" placeholder="Username" required autofocus>
</p>
<p>
<label for="password" class="sr-only">Password</label>
<input type="password" id="password" name="password" class="form-control" placeholder="Password" required>
</p>
<button class="btn btn-lg btn-primary btn-block" type="submit">Sign in</button>
<c:if test="${param.error}">
Invalid username and password.
</c:if>
<c:if test="${param.logout}">
You have been logged out.
</c:if>
</form>
</div>
</body></html>
Spring Boot 실행 후 http://localhost:8080/hello 입력을 하면 로그린 페이지가 나와야 하는데 404 페이지가 나온다.
아래의 2개의 라이브러리를 추가해주면 해결 된다.
dependencies {
....
implementation 'javax.servlet:jstl:1.2'
runtimeOnly 'org.apache.tomcat.embed:tomcat-embed-jasper'
....
}
추가해주고 다시 http://localhost:8080/hello 접속을 해주면 커스텀 로그인 페이지가 나타난다.
user, password를 입력 하여 로그인 하면 된다.
'spring-project' 카테고리의 다른 글
SpringBoot Logback.xml 추가 (로그 설정) (0) | 2019.02.24 |
---|---|
IntelliJ에서 Lombok 적용하기. (0) | 2019.02.24 |
SpringBoot Connection Pool - HikariCP (0) | 2019.02.23 |
Spring Boot Hello World 출력하기 (0) | 2019.02.23 |
Spring Boot 프로젝트 기동하기 (초기 프로젝트를 IntelliJ에서 Open 한 뒤에 실행하기) (0) | 2019.02.23 |