스프링 보안 양식 로그인

1. 소개

이 글은 Login with Spring Security 에 초점을 맞출 것 입니다. 로그인 메커니즘과 함께 웹 애플리케이션을 설정하는 데 필요한 부분이므로 간단한 이전 Spring MVC 예제를 기반으로 빌드 할 것입니다.

2. Maven 종속성

Spring Boot로 작업 할 때 spring-boot-starter-security 스타터는 spring-security-core , spring-security-webspring-security-config 와 같은 모든 종속성을 자동으로 포함합니다 .

 org.springframework.boot spring-boot-starter-security 2.3.3.RELEASE 

Spring Boot를 사용하지 않는 경우 필요한 모든 종속성을 추가하는 방법을 설명하는 Spring Security with Maven 문서를 참조하세요. 표준 spring-security-webspring-security-config 가 모두 필요합니다.

3. 스프링 보안 자바 구성

WebSecurityConfigurerAdapter 를 확장하는 Spring Security 구성 클래스를 작성하여 시작하겠습니다 .

@EnableWebSecurity 를 추가 하면 Spring Security 및 MVC 통합 지원이 제공됩니다.

@Configuration @EnableWebSecurity public class SecSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(final AuthenticationManagerBuilder auth) throws Exception { // authentication manager (see below) } @Override protected void configure(final HttpSecurity http) throws Exception { // http builder configurations for authorize requests and form login (see below) } }

이 예에서는 인 메모리 인증을 사용하고 3 명의 사용자를 정의했습니다.

다음으로 양식 로그인 구성을 만드는 데 사용한 요소를 살펴 봅니다.

먼저 인증 관리자를 구축해 보겠습니다.

3.1. 인증 관리자

인증 공급자는 특히 InMemoryUserDetailsManager 라는 간단한 메모리 내 구현으로 지원됩니다 . 이는 완전한 지속성 메커니즘이 아직 필요하지 않은 경우 신속한 프로토 타이핑에 유용합니다.

protected void configure(final AuthenticationManagerBuilder auth) throws Exception { auth.inMemoryAuthentication() .withUser("user1").password(passwordEncoder().encode("user1Pass")).roles("USER") .and() .withUser("user2").password(passwordEncoder().encode("user2Pass")).roles("USER") .and() .withUser("admin").password(passwordEncoder().encode("adminPass")).roles("ADMIN"); }

여기서는 하드 코딩 된 사용자 이름, 암호 및 역할을 사용하여 세 명의 사용자를 구성합니다.

Spring 5부터는 암호 인코더도 정의해야합니다 . 이 예에서는 BCryptPasswordEncoder를 사용했습니다 .

@Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); }

다음으로 HttpSecurity를 구성 해 보겠습니다.

3.2. 요청 승인을위한 구성

요청 승인에 필요한 구성을 수행하는 것으로 시작합니다.

여기서는 사용자가 인증 할 수 있도록 / login에 대한 익명 액세스를 허용 합니다. / adminADMIN 역할로 제한 하고 다른 모든 것을 보호합니다.

@Override protected void configure(final HttpSecurity http) throws Exception { http .csrf().disable() .authorizeRequests() .antMatchers("/admin/**").hasRole("ADMIN") .antMatchers("/anonymous*").anonymous() .antMatchers("/login*").permitAll() .anyRequest().authenticated() .and() // ... }

antMatchers () 요소 의 순서 는 중요 합니다. 더 구체적인 규칙이 먼저 나오고 그 다음이 더 일반적인 규칙 이옵니다 .

3.3. 양식 로그인 구성

다음으로 양식 로그인 및 로그 아웃을 위해 위의 구성을 확장합니다.

@Override protected void configure(final HttpSecurity http) throws Exception { http // ... .and() .formLogin() .loginPage("/login.html") .loginProcessingUrl("/perform_login") .defaultSuccessUrl("/homepage.html", true) .failureUrl("/login.html?error=true") .failureHandler(authenticationFailureHandler()) .and() .logout() .logoutUrl("/perform_logout") .deleteCookies("JSESSIONID") .logoutSuccessHandler(logoutSuccessHandler()); }
  • loginPage () – 사용자 정의 로그인 페이지
  • loginProcessingUrl () – 사용자 이름과 암호를 제출할 URL
  • defaultSuccessUrl () – 성공적인 로그인 후 랜딩 페이지
  • failureUrl () – 로그인 실패 후 방문 페이지
  • logoutUrl () – 사용자 정의 로그 아웃

4. 웹 애플리케이션에 Spring Security 추가

위에서 정의한 Spring Security 구성을 사용하려면 웹 애플리케이션에 첨부해야합니다.

WebApplicationInitializer를 사용 하므로 web.xml 을 제공 할 필요가 없습니다 .

public class AppInitializer implements WebApplicationInitializer { @Override public void onStartup(ServletContext sc) { AnnotationConfigWebApplicationContext root = new AnnotationConfigWebApplicationContext(); root.register(SecSecurityConfig.class); sc.addListener(new ContextLoaderListener(root)); sc.addFilter("securityFilter", new DelegatingFilterProxy("springSecurityFilterChain")) .addMappingForUrlPatterns(null, false, "/*"); } }

Spring Boot 애플리케이션을 사용하는 경우이 초기화 프로그램이 필요하지 않습니다. Spring Boot에서 보안 구성이로드되는 방법에 대한 자세한 내용은 Spring Boot 보안 자동 구성에 대한 기사를 참조하십시오.

5. 스프링 보안 XML 설정

해당 XML 구성도 살펴 보겠습니다.

전체 프로젝트는 Java 구성을 사용하므로 Java @Configuration 클래스 를 통해 XML 구성 파일을 가져와야합니다 .

@Configuration @ImportResource({ "classpath:webSecurityConfig.xml" }) public class SecSecurityConfig { public SecSecurityConfig() { super(); } }

그리고 Spring Security XML 구성 – webSecurityConfig.xml :

6. web.xml

Spring 4가 도입되기 전에 우리는 web.xml 에서 Spring Security 구성을 구성하는 데 사용 했습니다. 표준 Spring MVC web.xml에 추가 된 필터 만 추가되었습니다 .

Spring Secured Application     springSecurityFilterChain org.springframework.web.filter.DelegatingFilterProxy   springSecurityFilterChain /* 

필터 – DelegatingFilterProxy – 단순히 Spring 관리 빈 – FilterChainProxy – 전체 Spring 빈 라이프 사이클 관리 등의 혜택을받을 수 있습니다.

7. 로그인 양식

로그인 양식 페이지는 간단한 메커니즘을 사용하여 Spring MVC에 등록되어 그 사이에 명시적인 컨트롤러가 필요하지 않은 URL에 뷰 이름을 매핑합니다.

registry.addViewController("/login.html");

This, of course, corresponds to the login.jsp:


    
User:
Password:

The Spring Login form has the following relevant artifacts:

  • login – the URL where the form is POSTed to trigger the authentication process
  • username – the username
  • password – the password

8. Further Configuring Spring Login

We briefly discussed a few configurations of the login mechanism when we introduced the Spring Security Configuration above – let's go into some detail now.

One reason to override most of the defaults in Spring Security is to hide the fact that the application is secured with Spring Security and minimize the information a potential attacker knows about the application.

Fully configured, the login element looks like this:

@Override protected void configure(HttpSecurity http) throws Exception { http.formLogin() .loginPage("/login.html") .loginProcessingUrl("/perform_login") .defaultSuccessUrl("/homepage.html",true) .failureUrl("/login.html?error=true") }

Or the corresponding XML configuration:

8.1. The Login Page

Next, let's see how we can configure a custom login page using the loginPage() method:

http.formLogin() .loginPage("/login.html")

Or, via XML configuration:

login-page='/login.html'

If we don't specify this, Spring Security will generate a very basic Login Form at the /login URL.

8.2. The POST URL for Login

The default URL where the Spring Login will POST to trigger the authentication process is /login which used to be /j_spring_security_check before Spring Security 4.

We can use the loginProcessingUrl method to override this URL:

http.formLogin() .loginProcessingUrl("/perform_login")

Or, via XML configuration:

login-processing-url="/perform_login"

A good reason to override this default URL is to hide the fact that the application is actually secured with Spring Security – that information should not be available externally.

8.3. The Landing Page on Success

After a successful login process, the user is redirected to a page – which by default is the root of the web application.

We can override this via the defaultSuccessUrl() method:

http.formLogin() .defaultSuccessUrl("/homepage.html")

Or with XML configuration:

default-target-url="/homepage.html"

In case the always-use-default-target is set to true, then the user is always redirected to this page. If that attribute is set to false, then the user will be redirected to the previous page they wanted to visit before being prompted to authenticate.

8.4. The Landing Page on Failure

Same as with the Login Page, the Login Failure Page is autogenerated by Spring Security at /login?error by default.

To override this, we can use the failureUrl() method:

http.formLogin() .failureUrl("/login.html?error=true")

Or with XML:

authentication-failure-url="/login.html?error=true"

9. Conclusion

Spring 로그인 예제 에서는 간단한 인증 프로세스를 구성했습니다. Spring 보안 로그인 양식, 보안 구성 및 사용 가능한 일부 고급 사용자 지정에 대해 논의했습니다.

이 Spring Login 튜토리얼의 구현은 GitHub 프로젝트에서 찾을 수 있습니다. 이것은 Eclipse 기반 프로젝트이므로 그대로 가져 와서 실행하기 쉽습니다.

프로젝트가 로컬에서 실행되면 다음 위치에서 샘플 HTML에 액세스 할 수 있습니다.

//localhost:8080/spring-security-mvc-login/login.html