봄 보안이 더 강력한 기능을 가지고, 비교 인증 및 권한 부여 두 가지 주요 보안 모듈, 그리고 다른 인기있는 아파치 시로 보안 프레임 워크를 포함하는 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捕获并处理,所以我们在ExceptionTranslateFilter的doFilter方法catch代码块第一行打个断点:
我们待会模拟的是用户未登录直接访问/hello,所以应该是抛出用户未认证的异常,所以接下来应该跳转到UsernamePasswordAuthenticationFilter处理表单方式的用户认证。在UsernamePasswordAuthenticationFilter的attemptAuthentication方法上打个断点:
准备完毕后,我们启动项目,然后访问http://localhost:8080/hello,代码直接跳转到FilterSecurityInteceptor的断点上:
往下执行,因为当前请求没有经过身份认证,所以将抛出异常并被ExceptionTranslateFilter捕获:
捕获异常后重定向到登录表单登录页面,当我们在表单登录页面输入信息点login后,代码跳转到UsernamePasswordAuthenticationFilter过滤器的attemptAuthentication方法上:
判断用户名和密码是否正确之后,代码又跳回FilterSecurityInterceptor的beforeInvocation方法执行上:
当认证通过时,FilterSecurityInterceptor代码往下执行doFilter,然后代码最终跳转到/hello上:
浏览器页面将显示hello spring security