본문 바로가기

웹프로그래밍/spring~~

Spring security 적용해보자(1)

Step1. 스프링 시큐리티란

스프링 시큐리티를 간단하게 이해 해보겠습니다.

자바기반의 애플리케이션을 위한 포괄적인 보안서비스를 제공하는 오픈 플래폼이라고 생각하시면 됩니다. 또한 스프링 시큐리티를 활용해서 자신만의 인증 매커니즘을 만드는 것도 가능합니다. 스프링 시큐리티의 보안을 구성하는 두가지 영역이 있는데 인증(Authentication), 권한(Authorization)입니다. 인증은 로그인하는 과정등의 확인하는 절차이고 권한은 인증된 사용자가 가지고 있는 회원등급 같은 것 입니다. 

 

https://spring.io/guides/gs/securing-web/

 

Securing a Web Application

this guide is designed to get you productive as quickly as possible and using the latest Spring project releases and techniques as recommended by the Spring team

spring.io

위의 guide를 따라하셔도 되고

아래 설명을 따라하셔도 됩니다(아래 글이 더 간단해요~)

다음편에서 jpa를 이용해 회원가입, 로그인을 진행 하도록 해보겠습니다.

 

우선 gradle에 spring security를 추가 합니다.

dependencies{
	implementation 'org.springframework.boot:spring-boot-starter-security'
}

 

그리고 Refresh all gradle projects를 해줍니다.

 

resources/templates에 home.html을 만들고 아래 코드를 넣습니다.

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="https://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>스프링 시큐리티 예제</title>
</head>
<body>
    <h1>로그인 전!</h1>
    <a href="/hello"> hello 페이지로 이동</a>
</body>
</html>

 

resources/templates에 hello.html을 만들고 아래 코드를 넣습니다.

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="https://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>스프링 시큐리티 예제</title>
</head>
<body>
    <h1>로그인 성공!</h1>
    <form th:action="@{/logout}" method="post">
    	<input type="submit" value="Sign Out"/>
    </form>
</body>
</html>

 

resources/templates에 login.html을 만들고 아래 코드를 넣습니다.

-> 다음편에서 더 예쁜 로그인 페이지를 만들 꺼에요~

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="https://www.thymeleaf.org">
    <head>
        <title>스프링 시큐리티 예제 </title>
    </head>
    <body>
        <div th:if="${param.error}">
            Invalid username and password.
        </div>
        <div th:if="${param.logout}">
            You have been logged out.
        </div>
        <form th:action="@{/login}" method="post">
            <div><label> User Name : <input type="text" name="username"/> </label></div>
            <div><label> Password: <input type="password" name="password"/> </label></div>
            <div><input type="submit" value="Sign In"/></div>
        </form>
    </body>
</html>

 

src/main/java/config/MvcConfig.java 를 만들고 아래 코드를 넣습니다.

url에 대한 mapping 설정 입니다. -> 다음편에서 controller 파일로 코드를 옮길 것입니다.

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class MvcConfig implements WebMvcConfigurer {

    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/home").setViewName("home");
        registry.addViewController("/").setViewName("home");
        registry.addViewController("/hello").setViewName("hello");
        registry.addViewController("/login").setViewName("login");
    }

}

 

src/main/java/config/WebSecurityConfig.java 를 만들고 아래 코드를 넣습니다.

login 테스트를 위해 user의 아이디:user 패스워드:password로 세팅 되어 있습니다.

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
            .authorizeRequests()
                .antMatchers("/", "/index").permitAll()
                .anyRequest().authenticated()
                .and()
            .formLogin()
                .loginPage("/login")
                .permitAll()
                .and()
            .logout()
                .permitAll();
    }

    @Bean
    @Override
    public UserDetailsService userDetailsService() {
        UserDetails user =
             User.withDefaultPasswordEncoder()
                .username("user")
                .password("password")
                .roles("USER")
                .build();

        return new InMemoryUserDetailsManager(user);
    }
}

 

 

spring boot를 build하고 localhost에 접속하면 home.html이 나오고 hello페이지로 이동하면

 

 

 

hello.html은 권한이 있어야 접근 가능하기 때문에 login이 나옵니다 ID : user PW : password 로 로그인 하면

 

 

정상적으로 hello.html이 실행 됩니다.

 

 

반응형