스프링 시큐리티 봄 부팅 열려

스프링 시큐리티 봄 부팅 열려

봄 보안이 더 강력한 기능을 가지고, 비교 인증 및 권한 부여 두 가지 주요 보안 모듈, 그리고 다른 인기있는 아파치 시로 보안 프레임 워크를 포함하는 Spring 기반의 보안 프레임 워크입니다. 스프링 시큐리티는 쉽게 확장 요구를 충족하기 위해 사용자 정의 및 일반 웹 보안 공격에 대한 보호 지원을 제공 할 수 있습니다. 당신의 선택은 웹 프레임 워크 봄이면 좋은 선택이 될 것입니다 보안 보안의 관점에서 봄.

여기에서 우리는 봄 보안, 봄 부트 버전 통합하는 봄 부팅을 사용 1.5.14.RELEASE , 봄 보안 버전 4.2.7RELEASE을 .

열기 봄 보안

봄 부팅 프로젝트, 봄 부팅 스타터 보안의 다음 도입을 만듭니다

<의존성> 
  <의 groupId> org.springframework.boot </의 groupId>
  <artifactId를> 스프링 부팅 스타터 보안 </ artifactId를>
</ 의존성>

 

다음으로 우리는 TestController는, 외부의 제공 생성 / 헬로 서비스 :

@RestController 
공용 클래스 TestController {
  @GetMapping ( "안녕하세요")
  공공 문자열 안녕하세요 () {
      반환 "안녕하세요 봄 보안";
  }
}

 

우리가 직접 프로젝트를 시작이 시간, 방문 HTTP를 : // localhost를 : 8080 / 헬로 페이지가 HTTP 기본 인증 상자를 팝업 볼 수 있습니다 :

프로젝트가 봄 봄 보안에 의존 소개되었을 때 다음과 같이 프로젝트는 기본적으로 활성화되는시기 :

보안 : 
기본 :
  사용 가능 : 사실

 

이 구성은 모든 서비스가 IDE의 콘솔로 돌아 암호가 자동으로 스핑 보안에 의해 생성되며,이 인증, 기본 사용자 이름 사용자 있었음에 틀림에 액세스 HTTP 기본 인증의 유형을 열어, 암호 정보를 찾을 수 있습니다 :

기본 보안 암호를 사용 : e9ed391c-93de-4611-ac87-d871d9e749ac

 

사용자 이름 사용자를 입력 한 후, 암호 e9ed391c-93de-4611-ac87- d871d9e749ac, 우리는 성공적으로 액세스 할 수 있습니다 / 안녕하세요 인터페이스.

폼 기반 인증

우리는 다수의 구성을 통해 HTTP 기본 인증 폼 기반 인증을 수정할 수 있습니다.

구성 클래스 만들기 BrowserSecurityConfig가 상속 org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter 이 추상 클래스와 재정의 구성 (HttpSecurity HTTP) 방법을. WebSecurityConfigurerAdapter는 봄 보안 보안 구성 어댑터가 제공하는 웹 응용 프로그램입니다 :

@Configuration 
(가) WebSecurityConfigurerAdapter가 확장 BrowserSecurityConfig 공용 클래스는 {
  @Override가
  보호 무효 구성 (HttpSecurity HTTP)는 예외 {던졌습니다
      http.formLogin () // 폼 실시
              .AND ()
              .authorizeRequests를 () // 권한을 구성
              .anyRequest () // 모든 요청
              . ) (인증 // 인증을 필요
  }
}

 

스프링 시큐리티는 메소드 호출이 체인을 제공합니다. 상기 구성의 형태에 대한 인증 방법은 로그인 지정하고 모든 요청이 인증되어야한다. 우리가 프로젝트를 다시 시작 이번에는 다시 한 번 방문 HTTP를 : // localhost를 : 8080 /여보세요 , 당신은 형태에게 길을 형성하는 인증 방법은 이미 볼 수 있습니다 :

사용자 이름은 암호가 자동으로 스프링 시큐리티에 의해 생성되는, 여전히 사용자입니다. 자격 증명 오류를 입력하면 페이지에 오류 메시지가 나타납니다 :

당신이 HTTP 기본 인증 방법을 교환해야하는 경우, 우리는 단순히 수정해야하는 구성의 구성 방법 :

@Override 
무효 보호 구성은 (HttpSecurity HTTP) 예외 {던졌습니다
  // http.formLogin () // 양식 모드
  http.httpBasic () // HTTP 기본 모드
          .AND ()
          .authorizeRequests () // 권한을 구성
          .anyRequest를 () / / 모든 요청
          // 인증 필요) (.authenticated
}

 

기본적인

우리는 간단한 보안 구성 봄 보안을 열어보다도, 이제 봄 보안 아래의 기본 원리를 이해하자. 프로세스는, 상기 구성은도 프로그램의 코드를 실행함으로써 단순화 될 수있다 :

如上图所示,Spring Security包含了众多的过滤器,这些过滤器形成了一条链,所有请求都必须通过这些过滤器后才能成功访问到资源。其中UsernamePasswordAuthenticationFilter过滤器用于处理基于表单方式的登录认证,而BasicAuthenticationFilter用于处理基于HTTP Basic方式的登录验证,后面还可能包含一系列别的过滤器(可以通过相应配置开启)。在过滤器链的末尾是一个名为FilterSecurityInterceptor的拦截器,用于判断当前请求身份认证是否成功,是否有相应的权限,当身份认证失败或者权限不足的时候便会抛出相应的异常。ExceptionTranslateFilter捕获并处理,所以我们在ExceptionTranslateFilter过滤器用于处理了FilterSecurityInterceptor抛出的异常并进行处理,比如需要身份认证时将请求重定向到相应的认证页面,当认证失败或者权限不足时返回相应的提示信息。

下面我们通过debug来验证这个过程(登录方式改回表单的方式)。

我们在/hello服务上打个断点:

FilterSecurityInterceptor的invoke方法的super.beforeInvocation上打个断点:

当这行代码执行通过后,便可以调用下一行的doFilter方法来真正调用/hello服务,否则将抛出相应的异常。

FilterSecurityInterceptor抛出异常时,异常将由ExceptionTranslateFilter捕获并处理,所以我们在ExceptionTranslateFilterdoFilter方法catch代码块第一行打个断点:

我们待会模拟的是用户未登录直接访问/hello,所以应该是抛出用户未认证的异常,所以接下来应该跳转到UsernamePasswordAuthenticationFilter处理表单方式的用户认证。在UsernamePasswordAuthenticationFilterattemptAuthentication方法上打个断点:

准备完毕后,我们启动项目,然后访问http://localhost:8080/hello,代码直接跳转到FilterSecurityInteceptor的断点上:

往下执行,因为当前请求没有经过身份认证,所以将抛出异常并被ExceptionTranslateFilter捕获:

捕获异常后重定向到登录表单登录页面,当我们在表单登录页面输入信息点login后,代码跳转到UsernamePasswordAuthenticationFilter过滤器的attemptAuthentication方法上:

判断用户名和密码是否正确之后,代码又跳回FilterSecurityInterceptorbeforeInvocation方法执行上:

当认证通过时,FilterSecurityInterceptor代码往下执行doFilter,然后代码最终跳转到/hello上:

浏览器页面将显示hello spring security信息。

추천

출처www.cnblogs.com/7788IT/p/11626834.html