Spring Security에서 "Hello World!"

Spring Security는 Spring 프로젝트 중 하나이며 주로
웹 애플리케이션에 보안 기능을 추가하기 위한 프레임워크입니다.

자신의 프로젝트에서는, 이전부터 계속 사용하고 있습니다만, 자신의 회사의 젊은이용으로 재차 ​​정리하기 위해, 우선은 튜토리얼로부터 재차 해 보았습니다.

여기 의 내용이 됩니다만, Spring 의 버젼이 바뀌었기 때문에 deprecated 가 된 메소드등도 있었으므로 조금 재기록하고 있습니다.

환경



Eclipse Version: 2019-03 (4.11.0)
자바 11
Spring Boot 2.1.5
Spring Security 5.1.5

준비



새 프로젝트 만들기


  • Eclipse 시작
  • 파일 > 신규 > 프로젝트 선택
  • 마법사에서 Spring Starter Project를 선택합니다.
    - "다음"을 누르십시오
  • 이름은 적당한 설정, Java 버전 "11", "Gradle"을 선택하고 "다음"을 누르십시오
  • DevTools, Security, Web, Thymleaf를 선택하고 Finish를 누릅니다.

    화면 만들기



    화면은 src/main/resources/templates 아래에 생성됩니다.

    home.html



    hello.html에 대한 링크가있는 화면. 인증되지 않은 상태에서도 참조 페이지.
    <!DOCTYPE html>
    <html xmlns="http://www.w3.org/1999/xhtml"
        xmlns:th="https://www.thymeleaf.org"
        xmlns:sec="https://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
    <head>
    <title>Spring Security Example</title>
    </head>
    <body>
        <h1>Welcome!</h1>
    
        <p>
            Click <a th:href="@{/hello}">here</a> to see a greeting.
        </p>
    </body>
    </html>
    

    hello.html



    인증이 OK가 된 유저만 참조할 수 있는 페이지.
    <!DOCTYPE html>
    <html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="https://www.thymeleaf.org"
          xmlns:sec="https://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
        <head>
            <title>Hello World!</title>
        </head>
        <body>
            <h1 th:inline="text">Hello [[${#httpServletRequest.remoteUser}]]!</h1>
            <form th:action="@{/logout}" method="post">
                <input type="submit" value="Sign Out"/>
            </form>
        </body>
    </html>
    

    login.html



    로그인을 위한 정보를 입력하기 위한 화면. 물론 미인증으로도 참조할 수 있습니다.
    
    <!DOCTYPE html>
    <html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="https://www.thymeleaf.org"
          xmlns:sec="https://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
        <head>
         <title>Spring Security Example </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>
    

    HTML을 표시하기 위한 설정



    보통 Controller 클래스가 있지만 html을 표시하기 때문에 생략하고 있습니다. 하지만 Spring MVC가 인식하는 데 필요한 클래스입니다.
    @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");
        }
    }
    

    네. 여기까지 준비는 완료.

    Spring Security 설정



    그런데 여기에서가 본제.
    Spring Security의 동작을 정의하는 Config 클래스입니다.

    이전에는 XML로 작성이 주류였지만 최근? 자바 클래스에 정의하는 방법이 일반적입니다.
    @Configuration
    @EnableWebSecurity
    public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http
                .authorizeRequests()
                    .antMatchers("/", "/home").permitAll()    // アクセス制限のないURL
                    .anyRequest().authenticated()                // その他は認証済みでしかアクセスできない
                    .and()
                .formLogin()
                    .loginPage("/login").permitAll()               // ログイン画面の設定 アクセス制限なし
                    .and()
                .logout()
                    .permitAll();
        }
    
        @Override
        protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    
            // パスワード
            String password = passwordEncoder().encode("password");
    
            // インメモリの認証を行うための設定
            auth.inMemoryAuthentication()
                    .passwordEncoder(passwordEncoder())
                    .withUser("user").password(password).roles("USER");
        }
    
        @Bean
        public PasswordEncoder passwordEncoder() {
            return new BCryptPasswordEncoder();
        }
    
    }
    

    튜토리얼이라면,
       @Bean
        @Override
        public UserDetailsService userDetailsService() {
            UserDetails user =
                 User.withDefaultPasswordEncoder()
                    .username("user")
                    .password("password")
                    .roles("USER")
                    .build();
    
            return new InMemoryUserDetailsManager(user);
        }
    

    그리고, 인메모리의 인증을 설정하고 있습니다만, 「User.withDefaultPasswordEncoder()」가 Deprecated가 되어 있으므로, 다른 방법으로 기술하고 있습니다.

    시작



    이제 여기까지 오면 Eclipse에서 SpringBoot 응용 프로그램을 시작합시다.

    그 후 브라우저에 액세스합니다. 여기



    here의 링크를 클릭



    User Name, Password를 입력하고 "Sign In"을 누르십시오.



    네. 할 수 있었습니다.

    사이고에게



    우선은 Spring Security의 감촉을 알 수 있도록 HelloWorld를 해 보았습니다. 옛날 전이라면, Filter 사용해 엉망이었던 것을, 간단하게 실현할 수 있었을까라고 생각합니다.

    Spring Security에는, 기능이 아직도 많이 있기 때문에, 서서히 여러가지 소개하고 싶습니다.
  • 좋은 웹페이지 즐겨찾기