[Springboot2.x Security 입문 시리즈]1.웹 애플 리 케 이 션 의 안전 보호

Spring Security 는 Spring 기반 자바 웹 응용 프로그램의 안전 을 확보 하기 위해 유연 하고 강력 한 인증 과 접근 제어 프레임 워 크 입 니 다.이것 은 경량급 보안 프레임 워 크 로 Spring 기반 응용 프로그램 이 인증 과 권한 수여 지원 을 제공 하도록 확보 합 니 다.그것 은 Spring MVC 와 잘 통합 되 고 유행 하 는 안전 알고리즘 을 갖 추어 한데 묶 을 수 있다.본 튜 토리 얼 은 Spring Security 5 의 기본 과 고급 용법,고정 URL(예시 에 따라 정 함),보기 와 Spring boot/Hibernate 응용 방법 을 바탕 으로 하 는 예시 등 을 보 여 줍 니 다.
특히 이 튜 토리 얼 은 Spring MVC 나 Spring boot 개발 에 관 한 기초 지 도 를 하지 않 았 다.
목표
Spring MVC 프로그램 을 구축 할 것 입 니 다.이 프로그램 은 고정된 사용 자 를 사용 하여 폼 로그 인 형식 으로 페이지 를 보호 할 수 있 습 니 다.
뭐 공부 해요?
  • 약 15 분
  • 좋아 하 는 텍스트 편집기 나 IDE
  • JDK≥1.8
  • Maven 3.0+ or Grandle 2.3+
  • Thymeleaf 템 플 릿
  • 다음 IDE:Spring Tool Suite(STS)IntelliJ IDEA
  • 코드 를 직접 가 져 올 수도 있 습 니 다.
    시작
    1.디 렉 터 리 구조 만 들 기
    └── src
        └── main
            └── java
                └── com
                    └── spring
                        └── security
                            └── demo
    

    2.Gradle 빌 드 사용
    gradle 파일 만 들 기:build.gradle
    buildscript {
        repositories {
            mavenCentral()
        }
        dependencies {
            classpath("org.springframework.boot:spring-boot-gradle-plugin:1.5.7.RELEASE")
        }
    }
    
    apply plugin: 'java'
    apply plugin: 'eclipse'
    apply plugin: 'idea'
    apply plugin: 'org.springframework.boot'
    
    jar {
        baseName = 'gs-securing-web'
        version =  '0.1.0'
    }
    
    repositories {
        mavenCentral()
    }
    
    sourceCompatibility = 1.8
    targetCompatibility = 1.8
    
    dependencies {
        compile("org.springframework.boot:spring-boot-starter-thymeleaf")
        testCompile("junit:junit")
        testCompile("org.springframework.boot:spring-boot-starter-test")
        testCompile("org.springframework.security:spring-security-test")
    }
    

    3.Maven 구축 사용
    디 렉 터 리 구조 가 변 하지 않 는 파일 이름:pom.xml
    
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0modelVersion>
        <parent>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-parentartifactId>
            <version>2.2.1.RELEASEversion>
            <relativePath/> 
        parent>
        <groupId>com.spring.securitygroupId>
        <artifactId>demoartifactId>
        <version>0.1version>
        <name>demoname>
        <description>Demo project for Spring Boot-Securitydescription>
    
        <properties>
            <java.version>1.8java.version>
        properties>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-starter-webartifactId>
            dependency>
    
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-starter-thymeleafartifactId>
            dependency>
    
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-starter-securityartifactId>
            dependency>
    
            <dependency>
                <groupId>org.springframework.securitygroupId>
                <artifactId>spring-security-testartifactId>
                <scope>testscope>
            dependency>
    
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-starter-testartifactId>
                <scope>testscope>
                <exclusions>
                    <exclusion>
                        <groupId>org.junit.vintagegroupId>
                        <artifactId>junit-vintage-engineartifactId>
                    exclusion>
                exclusions>
            dependency>
        dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.bootgroupId>
                    <artifactId>spring-boot-maven-pluginartifactId>
                plugin>
            plugins>
        build>
    
        <repositories>
            <repository>
                <id>spring-releasesid>
                <name>Spring Releasesname>
                <url>https://repo.spring.io/libs-releaseurl>
            repository>
        repositories>
        <pluginRepositories>
            <pluginRepository>
                <id>spring-releasesid>
                <name>Spring Releasesname>
                <url>https://repo.spring.io/libs-releaseurl>
            pluginRepository>
        pluginRepositories>
    
    project>
    

    4.보호 되 지 않 는 웹 페이지 만 들 기
    웹 프로그램의 안전 을 보호 하기 전에 html 페이지 두 개 를 테스트 용 으로 만 듭 니 다.이 예 는 매우 간단 한 웹 프로그램 을 만 듭 니 다.다음 절 에 놓 고 Spring Security 를 사용 하여 보호 합 니 다.
    웹 프로그램 은 홈 페이지-home.html 와"Hello World"페이지 두 개의 간단 한 보 기 를 포함 합 니 다.
    4.1"홈 페이지"-home.html
    파일 경로:src/main/resources/templates/home.html
    
    <html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"
          xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
    <head>
        <title>Spring Security   title>
    head>
    <body>
    <h1>  !h1>
    
    <p>   <a th:href="@{/hello}">  a>     .p>
    body>
    html>
    

    4.2"hello world page"-hello.html
    파일 경로:src/main/resources/templates/hello.html
    
    <html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"
          xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
    <head>
        <title>Spring Security   -Hello World!title>
    head>
    <body>
    <h1>Hello World!h1>
    body>
    html>
    

    4.3 웹 애플 리 케 이 션 의 Spring MVC 설정-MvcConfig.java
    파일 경로:src/main/com/spring/security/config/MvcConfig.java
    package com.spring.security.demo.config;
    
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
    
    /**
     * @author: Cavan.Liu
     * @date: 2020-02-16 23:21:35
     * @description:
     */
    @Configuration
    public class MvcConfig extends WebMvcConfigurationSupport {
        @Override
        protected void addViewControllers(ViewControllerRegistry registry) {
            super.addViewControllers(registry);
    
            registry.addViewController("/home").setViewName("home");
            registry.addViewController("/").setViewName("home");
            registry.addViewController("/hello").setViewName("hello");
            registry.addViewController("/login").setViewName("login");
        }
    }
    

    a.addViewControllers()방법(WebMvcConfigurationSupport 의 같은 이름 을 덮어 쓰 는 방법)에 네 개의 보기 컨트롤 러 가 추가 되 었 습 니 다.b.두 보기 컨트롤 러 는'홈'이라는 보기(home.html 에서 정의)를 참조 하고 다른 참조 이름 은'hello'인 보기(hello.html 에서 정의)를 참조 합 니 다.c.네 번 째 보기 컨트롤 러 는 다른'login'이라는 보 기 를 참조 합 니 다.이 보 기 는 다음 부분 에서 만 들 것 입 니 다.
    로그 인 없 이 프로그램 을 실행 하고 실행 할 수 있 습 니 다.이 를 바탕 으로 기본 적 이 고 간단 한 웹 프로그램 을 만 든 후 보안 을 추가 할 준 비 를 할 수 있 습 니 다.
    5.Spring Security 구성 요소 설치
    사용자 가 권한 이 부여 되 지 않 은'/hello'에 접근 하 는 것 을 방지 하고 싶다 면.이때 사용자 가 홈 페이지 의 링크 를 클릭 하면 인사말 을 볼 수 있 고 어떠한 보호 도 추가 되 지 않 아 요청 이 차단 되 지 않 았 다.따라서 사용자 가 이 페이지 를 보기 전에 먼저 로그 인 을 해 야 할 방문 의 사전 조건 을 추가 해 야 합 니 다.
    응용 프로그램 에 Spring Security 를 설정 하여 실현 할 수 있 습 니 다.Spring Security 가 클래스 경로 에 있 으 면 Spring Boot 는"Basic 인증"을 사용 하여 모든 HTTP 터미널 을 자동 으로 보호 합 니 다.또한,보안 설정 을 사용자 정의 할 수 있 습 니 다.그리고 우리 가 해 야 할 첫 번 째 일 은 Spring Security 를 클래스 경로 에 추가 하 는 것 입 니 다.
    5.1 Spring Security 구성 요소 추가
    Gradle 사용:파일:build.gradle
    dependencies {
        ...
        compile("org.springframework.boot:spring-boot-starter-security")
        ...
    }
    

    Maven(버 전 을 추가 하지 않 은 것 은 Springboot 가 가장 적합 한 버 전과 자동 으로 일치 하기 때 문 입 니 다):파일:pom.xml
    <dependencies>
        ...
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-starter-securityartifactId>
            dependency>
        ...
    dependencies>
    

    5.2 보안 설정 추가
    파일 경로:src/main/com/spring/security/config/WebSecurityConfig.java
    package com.spring.security.demo.config;
    
    import org.springframework.context.annotation.Configuration;
    import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
    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.crypto.factory.PasswordEncoderFactories;
    import org.springframework.security.crypto.password.PasswordEncoder;
    
    /**
     * @author: Cavan.Liu
     * @date: 2019-11-10 14:06:17
     * @description:   WebSecurityConfigurerAdapter,          Web         
     */
    @Configuration
    @EnableWebSecurity      //   Spring Security Web    ,   Spring MVC  
    public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
        /**
         * Http security config
         *        、      URL  
         * @param http
         * @throws Exception
         */
        @Override
        protected void configure(HttpSecurity http) throws Exception {
    //        super.configure(http);
    
            http.authorizeRequests()
                //      [/] [/home]   
                    .antMatchers("/", "/home")
                    .permitAll()
                    .anyRequest()
                    .authenticated()
                    .and()
                //     
                .formLogin()
                    .loginPage("/login")
                    .permitAll()
                    .and()
                //   
                .logout()
                    .permitAll();
        }
    
        @Override
        protected void configure(AuthenticationManagerBuilder auth) throws Exception {
            //            
            //super.configure(auth);
    
            //      
            PasswordEncoder pwdEncoder = PasswordEncoderFactories.createDelegatingPasswordEncoder();
    
            auth.inMemoryAuthentication()
                    .withUser("user")
                    .password(pwdEncoder.encode("111111"))
                    .roles("USER");
        }
    }
    

    @EnableWebSecurity 주해 의 역할 은 Spring Security 의 웹 보안 지원 을 사용 하고 Spring MVC 통합 을 제공 합 니 다.웹 보안 ConfigurerAdapter 클래스 를 계승 하고 웹 보안 설정 의 세부 사항 을 설정 하 는 방법 도 덮어 씁 니 다.
    configure(HttpSecurity)방법의 역할 은 어떤 URL 경로 가 보호 되 어야 하 는 지,어떤 경로 가 보호 되 지 말 아야 하 는 지 를 정의 합 니 다.구체 적 으로'/'와'/home'경 로 는 인증 없 이 접근 할 수 있 도록 설정 되 어 있 으 며,모든 다른 경 로 는 인증 을 거 쳐 야 접근 할 수 있 습 니 다.
    사용자 가 로그 인 에 성공 하면 이전에 요청 한 인증 이 필요 한 페이지 로 재 설정 합 니 다.loginPage()가 지정 한 사용자 정의'/로그 인'페이지 가 있 습 니 다.누구나 볼 수 있 습 니 다.
    configure(AuthenticationManager Builder)방법 에 대해 하나의 사용 자 를 메모리 에 설정 합 니 다.이 사용자 의 사용자 이름 은"user"이 고 비밀 번 호 는"111111"이 며 역할 은"USER"입 니 다.현재 응용 프로그램의 사용 을 편리 하 게 하고 더욱 간결 합 니 다.이 곳 은 Security 의 사용 방법 을 검증 하기 위 한 것 이기 때문에 실제 생산 개발 은 데이터 베이스 로 설정 해 야 합 니 다.
    이 때,login.html 라 는 로그 인 페이지 를 정식으로 만들어 사용자 이름과 비밀 번 호 를 검사 할 수 있 습 니 다.파일 경로:src/main/resources/templates/login.html
    
    <html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"
          xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
    
    <head>
        <title>Spring Security   -    title>
    head>
    
    <body>
    <div th:if="${param.error}">
                 .
    div>
    
    <div th:if="${param.logout}">
             .
    div>
    
    <form th:action="@{/login}" method="post">
        <div>
            <label>    :
                <input type="text" name="username"/>
            label>
        div>
        <div>
            <label>   :
                <input type="password" name="password"/>
            label>
        div>
        <div>
            <input type="submit" value="  "/>
        div>
    form>
    
    body>
    html>
    

    a.이 login 페이지 는 Thymeleaf 템 플 릿 을 사용 하고 사용자 이름과 비밀 번 호 를 가 져 오 는 폼 만 제공 하 며'/login'에 제출 합 니 다.b.설정 에 따라 Spring Security 는 이 요청 을 차단 하고 사용자 의 필 터 를 검증 합 니 다.c.사용자 가 인증 을 통과 하지 않 으 면 이 페이지 는'/login?error'로 다시 설정 하고 페이지 에 해당 하 는 오류 메 시 지 를 표시 합 니 다.d.로그아웃 에 성공 하면 저희 프로그램 은'/login?logout'에 보 내 고 저희 페이지 는 성공 적 인 메 시 지 를 표시 합 니 다.e.마지막 으로 저 희 는 사용자 에 게 현재 사용자 이름과 로그 인 방법 을 제공 해 야 합 니 다.또한 hello.html 를 업데이트 하여 현재 사용자 에 게 hello 한 마디 를 인쇄 하고'로그아웃'폼 을 포함 합 니 다.
    수 정 된 hello.html 파일 경로:src/main/resources/templates/hello.html
    
    <html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"
          xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
    <head>
        <title>Spring Security   -Hello World!title>
    head>
    <body>
    <h1 th:inline="text">Hello [[${#httpServletRequest.remoteUser}]]!h1>
    <form th:action="@{/logout}" method="post">
        <input type="submit" value="  "/>
    form>
    body>
    html>
    

    a.hello.html 는 Spring Security 와 HttpServletRequest 의 getRemoteUser()방법 을 통합 하여 사용자 이름 을 표시 합 니 다.b."로그 인"폼 은 POST 요청 을"/logout"에 제출 하고 로그아웃 에 성공 하면 사용 자 를"/login?logout"으로 다시 설정 합 니 다.
    5.3 시작 방법 추가-Spring boot 방식
    파일 경로:src/main/com/spring/security/security 01application.java
    package com.spring.security.demo;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    public class Secury01Application {
        public static void main(String[] args) {
            SpringApplication.run(Secury01Application.class, args);
        }
    }
    

    @SpringBootApplication 주해 의 역할(아래 주해 포함):a.@Configuration 은 이러한 종류의 Spring 응용 상하 문 정의 Bean 의 원본 을 표시 합 니 다.b.@EnableAutoConfiguration 은 Spring Boot 에 클래스 경로,다른 클래스,다양한 설정 에 Bean 의 정 의 를 추가 하 라 고 알려 줍 니 다.일반적으로 Spring MVC 응용 프로그램 에@EnableWebMvc 주 해 를 추가 해 야 하지만,springboot 에서 클래스 경로 에 spring-webmvc 의존 이 존재 하 는 것 을 발견 하면 자동 으로 웹 지원 을 추가 합 니 다.이 표 시 를 웹 애플 리 케 이 션 으로 표시 하고 Dispatcher Servlet 과 같은 핵심 설정 을 활성화 합 니 다.c.@Componentscan 은 Spring 에 게 com.spring.security 패키지 에 있 는 다른 구성 요소,설정 과 서비스(components,configurations,and services)를 스 캔 하고 컨트롤 러(controllers)를 찾 도록 합 니 다.
    이로써 보안 보호 가 간단 하고 유사 하거나 우리 가 잘 아 는 자바 입문 급,main 함 수 를 통 해 입구 로 하 는 웹 응용 이 기본적으로 구축 되 었 습 니 다.
    6.Jar 또는 IDEA 를 시작 할 때
    IDEA 응용 프로그램 을 사용 하여 시작 하거나 자바-jar 방식 으로 시작 해도 됩 니 다.
    총화
    Spring MVC 나 Spring boot 개발 경험 이 있 는 학생 들 에 게 이 강 좌 를 배 우 는 것 을 권장 합 니 다.Security 에 관 한 통합 은 수익 이 많 을 것 입 니 다.Springboot 의 일부 구성 요소 학습 에 대한 건 의 는 제 가 발표 한 시리즈 강 좌 를 볼 수 있 는 것 을 제외 하고 영어 에 여력 이 있 는 학생 들 은 가능 한 한 공식 적 으로 제공 하 는 설명 을 봐 야 합 니 다.spring.io
    원본 주소
    https://github.com/Cavan2477/Springboot2-security01.git

    좋은 웹페이지 즐겨찾기