spring-project

Spring Boot에 Spring Security 적용하기 (Spring Security Java Config)

가는가래 2019. 2. 23. 18:03

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를 입력 하여 로그인 하면 된다.