ディレクトリ
4 WebSecurityConfigurerAdapter配置
1つの概要
春のセキュリティは、それはより強力な機能を持って、認証および承認は、2つの主要なセキュリティモジュール、および比較の他の人気のApache史郎セキュリティフレームワークです含みSpringベースのセキュリティフレームワークです。春のセキュリティにも簡単に拡張ニーズに合わせてカスタマイズし、一般的なWebセキュリティ攻撃に対する保護のサポートを提供することができます。あなたの選択は、Webフレームワークの春である場合、セキュリティ、セキュリティの面で春を選ぶとよいでしょう。
ここでは、春のセキュリティ、春ブーツバージョン1.5.14.RELEASE、春のセキュリティバージョン4.2.7RELEASEを統合する春のブートを使用しています。
図2は、 ポンポン参加します
<依存>
<groupIdを> org.springframework.boot </ groupIdを>
<たartifactId>春・ブート・スターター・セキュリティ</たartifactId>
</依存関係>
次に我々は、TestControllerを作成し、外部A /ハローサービスを提供します。
@RestController
パブリッククラスTestController {
( "こんにちは")@GetMapping
パブリック文字列のHello(){
「ハロー春のセキュリティ」を返します。
}
}
構成3への参加
プロジェクトは次のようにプロジェクトがデフォルトで有効になりますとき春春のセキュリティに依存して導入されたとき:
セキュリティ:
基本:
有効:真
この構成は、HTTP基本認証の種類を開き、すべてのサービスがこの認定は、デフォルトのユーザー名のユーザーを持っている必要がありますアクセス、パスワードが自動的にSPINGセキュリティ、IDEのコンソールへの復帰によって生成され、パスワードの情報を見つけることができます。
デフォルトのセキュリティパスワードを使用する:e9ed391c-93de-4611-ac87-d871d9e749ac
ユーザ名、ユーザ、パスワードe9ed391c-93de-4611-ac87-d871d9e749acを入力した後、我々が正常にアクセス/ハローインターフェースできるようになります。
フォームベースの認証
私たちは、多数の構成を通じてHTTP基本認証フォームベース認証を変更することができます。
4 WebSecurityConfigurerAdapter配置
コンフィギュレーション・クラスBrowserSecurityConfig継承org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapterこの抽象クラスとオーバーライドの設定(HttpSecurity HTTP)メソッドを作成します。WebSecurityConfigurerAdapterは春のセキュリティセキュリティの構成アダプターが提供するWebアプリケーションです。
@Configuration
public class BrowserSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.formLogin() // 表单方式
.and()
.authorizeRequests() // 授权配置
.anyRequest() // 所有请求
.authenticated(); // 都需要认证
}
}
春のセキュリティは、メソッド呼び出しのこのチェーンを提供します。上記の構成は、内のフォームログの認証方法を指定し、すべての要求を認証する必要があります。我々はプロジェクトを再起動します。この時間は、再び訪問にhttp:// localhost:8080 /こんにちは、あなたはすでに認証方法をされて見る形の道を形成することができます。
ユーザー名は、パスワードが自動的に春のセキュリティによって生成され、まだユーザーです。あなたは資格証明書エラーを入力すると、エラーメッセージがページに表示されます:
4.1基本原理
私たちは、簡単なセキュリティ設定春のセキュリティを開いた上で、のは、春のセキュリティの下で基本的な原理を理解しましょう。プロセスは、上記の構成によれば、図に示すのコードを実行することによって簡略化することができます。
如上图所示,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信息。