Spring Securityでの付与された権限と役割
1. 概要
この簡単な記事では、the subtle but significant difference between a Role and a GrantedAuthority in Spring Securityについて説明します。 ロールと権限の詳細については、記事hereを参照してください。
参考文献:
REST APIのSpring Security
Spring SecurityでREST APIを保護する方法-XML構成、web.xml、認証用のHTTPステータスコードなど
2. GrantedAuthority
Spring Securityでは、think of each GrantedAuthority as an individual privilegeを実行できます。 例には、READ_AUTHORITY、WRITE_PRIVILEGE、さらにはCAN_EXECUTE_AS_ROOTが含まれます。 理解しておくべき重要なことは、the name is arbitraryということです。
hasAuthority(‘READ_AUTHORITY'),のような式を使用するなどして、GrantedAuthorityを直接使用する場合、restricting access in a fine-grained mannerになります。
おそらく収集できるように、privilegeを使用してauthorityの概念を参照することもできます。
3. 権威としての役割
同様に、Spring Securityでは、think of each Role as a coarse-grained GrantedAuthority that is represented as a String and prefixed with “ROLE“を実行できます。 hasRole(“ADMIN”)のような式を介するなど、Roleを直接使用する場合、大まかな方法でアクセスを制限しています。
デフォルトの「ROLE”プレフィックス」は構成可能ですが、その方法を説明することはこの記事の範囲を超えていることに注意してください。
The core difference between these two is the semantics we attach to how we use the feature.フレームワークの場合、違いは最小限です。基本的に、これらはまったく同じ方法で処理されます。
4. コンテナとしての役割
フレームワークがroleの概念をどのように使用するかを見てきたので、別の方法、つまりusing roles as containers of authorities/privilegesについても簡単に説明しましょう。
これはロールに対するより高いレベルのアプローチであり、実装中心のコンセプトではなく、よりビジネスに面したコンセプトにします。
Spring Securityフレームワークは、概念の使用方法に関するガイダンスを提供していないため、選択は完全に実装固有です。
5. Spring Securityの構成
READ_AUTHORITYを持つユーザーに/protectedbyauthorityへのアクセスを制限することにより、きめ細かい承認要件を示すことができます。
ROLE_USERを持つユーザーに/protectedbyroleへのアクセスを制限することにより、大まかな承認要件を示すことができます。
このようなシナリオをセキュリティ構成で構成しましょう。
@Override
protected void configure(HttpSecurity http) throws Exception {
// ...
.antMatchers("/protectedbyrole").hasRole("USER")
.antMatchers("/protectedbyauthority").hasAuthority("READ_PRIVILEGE")
// ...
}
6. 単純なデータ初期化
コアの概念をよりよく理解したので、アプリケーションの起動時にセットアップデータを作成する方法について説明しましょう。
もちろん、これは非常に簡単な方法であり、開発中にいくつかの予備テストユーザーで実行を開始します。運用環境でデータを処理する方法ではありません。
コンテキスト更新イベントをリッスンします。
@Override
@Transactional
public void onApplicationEvent(ContextRefreshedEvent event) {
MyPrivilege readPrivilege
= createPrivilegeIfNotFound("READ_PRIVILEGE");
MyPrivilege writePrivilege
= createPrivilegeIfNotFound("WRITE_PRIVILEGE");
}
ここでの実際の実装は実際には重要ではありません。通常、使用している永続性ソリューションによって異なります。 重要な点は、コードで使用している権限を維持しているということです。
7. UserDetailsService
UserDetailsService is where the authority mapping takes placeの実装。 ユーザーが認証されると、getAuthorities()メソッドが入力され、UserDetailsオブジェクトを返します。
private Collection extends GrantedAuthority> getAuthorities(
Collection roles) {
List authorities
= new ArrayList<>();
for (Role role: roles) {
authorities.add(new SimpleGrantedAuthority(role.getName()));
role.getPrivileges().stream()
.map(p -> new SimpleGrantedAuthority(p.getName()))
.forEach(authorities::add);
}
return authorities;
}
8. 例の実行とテスト
GitHub projectにあるサンプルRolesAuthoritiesApplicationJavaアプリケーションを実行できます。
役割ベースの承認が実際に行われていることを確認するには、次のことを行う必要があります。
-
[email protected]として認証します(パスワードは“user”)
-
承認に注意してください
-
失敗した認証に注意してください
権限ベースの承認が実際に行われていることを確認するには、アプリケーションからログアウトしてから、次のことを行う必要があります。
-
[email protectedとして認証] / admin
-
承認に注意してください
-
失敗した認証に注意してください
9. 結論
このクイックチュートリアルでは、Spring SecurityのRoleとGrantedAuthorityの微妙ではあるが重要な違いについて説明しました。