1.Springセキュリティの概要
Spring Securityは、Springベースのアプリケーションに宣言型のセキュリティ保護を提供するセキュリティフレームワークであり、Webリクエストレベルとメソッド呼び出しレベルでIDの検証と承認を処理する完全なセキュリティソリューションを提供します。Springフレームワークに基づいているため、SpringSecurityは依存性注入とアスペクト指向テクノロジーを最大限に活用します。
Spring Securityは、主に2つの側面からセキュリティの問題を解決します。
-
Webリクエストレベル:サーブレット仕様のフィルタを使用して、Webリクエストを保護し、URLレベルでアクセスを制限します。
-
メソッド呼び出しレベル:Spring AOPを使用してメソッド呼び出しを保護し、適切な権限を持つユーザーのみが保護されたメソッドにアクセスできるようにします。
Spring Securityの関連する概念と実装原則を深く理解したい場合は、ポータルをクリックしてください=="SpringSecurityの基本原則
次に、SpringSecurityのWebリクエストレベルのセキュリティデモ
1.新しいSpringプロジェクトを作成し、pomにspringsecurity依存関係を追加します。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
2.SpringSecurityの構成クラスを作成します
package com.spring.security.springsecurity.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
@Configuration
@EnableWebSecurity //启用Web安全功能
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
//访问"/"和"/home"路径的请求都允许
.antMatchers("/", "/home","/staff","/staff/*")
.permitAll()
//而其他的请求都需要认证
.anyRequest()
.authenticated()
.and()
//修改Spring Security默认的登陆界面
.formLogin()
.loginPage("/login")
.permitAll()
.and()
.logout()
.permitAll();
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception{
//基于内存来存储用户信息
auth.inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder())
.withUser("user").password(new BCryptPasswordEncoder().encode("123")).roles("USER").and()
.withUser("admin").password(new BCryptPasswordEncoder().encode("456")).roles("USER","ADMIN");
}
}
コード分析:
@EnableWebSecurityアノテーション:Webセキュリティ機能を有効にします(ただし、それ自体は役に立ちません。SpringSecurity構成クラスもWebSecurityConfigurerを実装するか、WebSecurityConfigurerAdapterクラスを継承する必要があります。後者は構成と使用が簡単なため、このデモで使用されます)。
@EnableWebMvcSecurityアノテーション:Spring4.0で非推奨になりました。
WebSecurityConfigurerAdapterクラス:このクラスの3つのconfigure()メソッドをオーバーロードすることにより、Webセキュリティの詳細を指定できます。
1. configure(WebSecurity):このメソッドをオーバーロードすることにより、SpringSecurityのフィルターチェーンを構成できます。
2. configure(HttpSecurity):このメソッドをオーバーライドすることにより、インターセプターを介してリクエストを保護する方法を構成できます。
保護パスを構成する方法
方法
できる
access(String)
指定されたSpEL式がtrueと評価された場合にアクセスを許可します
匿名()
匿名ユーザーアクセスを許可する
authentication()
認証されたユーザーにアクセスを許可する
denyAll()
無条件にすべてのアクセスを拒否します
fullAuthenticated()
ユーザーが完全に認証されている場合(Remember-me機能によって認証されていない場合)、アクセスが許可されます
hasAnyAuthority(String…)
ユーザーが指定された権限の1つを持っている場合は、アクセスを許可します
hasAnyRole(String…)
ユーザーが指定された役割のいずれかを持っている場合にアクセスを許可する
hasAuthority(String)
ユーザーが指定された権限を持っている場合はアクセスを許可する
hasIpAddress(String)
指定されたIPアドレスからのリクエストの場合はアクセスを許可する
hasRole(String)
ユーザーが特定の役割を持っている場合にアクセスを許可する
いいえ()
他のアクセス方法の結果を無効にする
すべて許可()
無条件アクセス
私を覚えてますか()
ユーザーがRemember-me機能によって認証されている場合にアクセスを許可する
SpringSecurityでサポートされているすべてのSpEL式は次のとおりです。
安全な表現
計算結果
認証
ユーザー認証オブジェクト
denyAll
結果は常に偽です
hasAnyRole(役割のリスト)
ユーザーに指定された権限のいずれかが付与されている場合はtrue
hasRole(ロール)
ユーザーに指定された権限が付与されている場合はtrue
hasIpAddress(IPアドレス)
ユーザーアドレス
isAnonymous()
匿名ユーザーですか
isAuthenticated()
匿名ユーザーではありません
isFullyAuthenticated
匿名でも覚えていない認証
isRemberMe()
リメンバーミー認定
すべて許可
常に真実
主要な
ユーザーの主な情報オブジェクト
3. configure(AuthenticationManagerBuilder):このメソッドをオーバーロードすることにより、user-detail(ユーザー詳細)サービスを構成できます。
ユーザーの詳細を構成する方法
方法
説明
accountExpired(ブール値)
アカウントの有効期限が切れているかどうかを定義します
accountLocked(ブール値)
アカウントがロックされているかどうかを定義します
と()
接続構成用
当局(GrantedAuthority…)
ユーザーに1つ以上の権限を付与する
当局(リスト)
ユーザーに1つ以上の権限を付与する
権限(文字列…)
ユーザーに1つ以上の権限を付与する
authenticationExpired(ブール値)
クレデンシャルの有効期限が切れているかどうかを定義します
無効(ブール値)
アカウントが無効になっているかどうかを定義します
パスワード(文字列)
ユーザーのパスワードを定義する
ロール(文字列…)
ユーザーに1つ以上の役割を付与する
ユーザー情報を保存する方法は3つあります。
** 1。メモリベースのユーザーストレージを使用する:**inMemoryAuthentication()
方法を通じて、メモリベースのユーザーストレージを有効化、構成、および任意に設定できます。また、このメソッドを呼び出しwithUser()
て、メモリ内のユーザーストアに新しいユーザーを追加できます。このメソッドのパラメーターはですusername
。このメソッドはUserDetailsManagerConfigurer.UserDetailsBuilderを返します。これは、ユーザーのパスワードを設定したり、特定のユーザーに1つ以上のロール権限を付与したりwithUser()
する方法など、ユーザーをさらに構成するためのいくつかのメソッドを提供します。methodはmethodの省略形であることに注意してください。メソッドに指定された値にはプレフィックスが付けられ、権限としてユーザーに付与されます。したがって、アピールコードユーザーの権限は次のとおりです。パスワードエンコーダー(エンコーダー)を指定する方法を使用して、ユーザーパスワードを暗号化して保存できます。password()
roles()
roles()
authorities()
roles()
ROLE_
ROLE_USER,ROLE_ADMIN。而
passwordEncoder()
** 2.データベーステーブルに基づく認証:**ユーザーデータは通常、リレーショナルデータベースに保存され、JDBCを介してアクセスされます。JDBCベースのユーザーストアを使用するようにSpringSecurityを構成するには、jdbcAuthentication()
メソッドを使用してそのデータソースを構成し、リレーショナルデータベースにアクセスできるようにします。
** 3. LDAPベースの認証:** Spring SecurityがLDAPベースの認証を使用するために、このldapAuthentication()
方法を使用できます。
3.コントローラーレイヤーコードとフロントエンドコード
SecurityControllerコードは次のとおりです。
package com.spring.security.springsecurity.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class SecurityController {
@GetMapping(value = {"/home","/"})
public String home(){
return "home";
}
@GetMapping(value = "/hello")
public String hello(){
return "hello";
}
@GetMapping(value = "/login")
public String login(){
return "login";
}
}
home.html
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:th="http://www.thymeleaf.org"
xmlns:sec="http://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
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"
xmlns:sec="http://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="http://www.thymeleaf.org"
xmlns:sec="http://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>
4.運用結果と分析
localhost:8080 / helloに直接アクセスすると、ページはhttp:// localhost:8080 / loginにジャンプします。これは、SecurityConfigクラスが、ログインせずに「/」および「/home」パスの要求のみを構成するためです。 、他のリクエストには認証が必要です。(注:調整を行ったため、ここでポートを8081に変更しました。通常どおりポート8080にアクセスできます。)
この時点で、ログインインターフェイスに入り、SecurityConfigのメモリストレージに基づいてユーザー名とパスワードを設定すると、helloインターフェイスに正常にジャンプします。
3、SpringSecurityのメソッド呼び出しレベルのセキュリティデモ
Spring Securityは、次の3つの異なるセキュリティ注釈を提供します。
- SpringSecurity独自の@Securedアノテーション。
- @RolesAllowedJSR-250のアノテーション。
- @ PreAuthorize、@ PostAuthorize、@ PreFilter、@PostFilterなどの式駆動型アノテーション。
注釈
説明
@PreAuthorize
メソッド呼び出し前の式の評価に基づいて、メソッドへのアクセスを制限します
@PostAuthorize
メソッドの呼び出しは許可されていますが、式がfalseと評価された場合、セキュリティ例外がスローされます
@PostFilter
メソッドの呼び出しは許可されていますが、メソッドの結果は式でフィルタリングする必要があります
@PreFilter
メソッド呼び出しは許可されていますが、メソッドに入る前に入力値をフィルタリングする必要があります
1.アノテーションベースのメソッドセキュリティを有効にする
Springでは、アノテーションベースのメソッドセキュリティを有効にする場合、重要なのは、次のような構成クラスで@EnableGlobalMethodSecurityを使用することです。
package com.spring.security.springsecurity.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.method.configuration.GlobalMethodSecurityConfiguration;
@Configuration
@EnableGlobalMethodSecurity(securedEnabled = true,jsr250Enabled = true,prePostEnabled = true)
public class MethodSecurityConfig extends GlobalMethodSecurityConfiguration {
}
ここでsecuredEnabled=trueを設定すると、Springはポイントカットを作成し、@Securedアノテーションが付けられたメソッドがアスペクトに入らないようにします。同様に、jsr250Enabled=trueおよびprePostEnabled=trueは、それぞれ@RolesAllowedおよび式駆動型アノテーションを有効にします。
この時点でMethodSecurityConfigクラスを構成した後、アピールコードに基づいてSecurityControllerにメソッドを追加できます。
@GetMapping(value = "/admin")
@Secured("ROLE_ADMIN")
public String admin(){
return "admin";
}
admin.htmlインターフェースは次のとおりです。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>admin</title>
</head>
<body>
<h1>admin page</h1>
</body>
</html>
この時点で、ユーザーユーザーとしてhttp:// localhost:8081 / adminパスにアクセスするにはどうすればよいですか?403エラーが発生します。
管理者ユーザーとしてhttp:// localhost:8081 / adminパスにアクセスすると、アクセスが成功したことを示す次のインターフェイスが表示されます。