[解決済み】Spring SecurityのRoleとGrantedAuthorityの違いについて
質問
Spring Securityには、以下のような概念と実装があります。
GrantedAuthority
インターフェイスを使用して
権限
を使用して、アクセスを認可/制御します。
というような許容される操作にしてほしいです。
サブユーザを作成する
または
アカウント削除
を許可します。
管理者
(ロール
ROLE_ADMIN
).
ネットでチュートリアルやデモを見るにつけ、混乱してきました。私は読んだことを結びつけようとしていますが、この2つを互換的に扱っているように思います。
なるほど
hasRole
を消費して
GrantedAuthority
文字列?私は間違いなく理解を間違えています。Spring Securityでは、これらは概念的に何ですか?
ユーザーのロールを、そのロールの権限とは別に保存するにはどうすればよいですか?
また、私は
org.springframework.security.core.userdetails.UserDetails
インターフェースは、認証プロバイダを参照する DAO で使用されるもので、これは
User
(最後のGrantedAuthorityに注意)。
public User(String username,
String password,
boolean enabled,
boolean accountNonExpired,
boolean credentialsNonExpired,
boolean accountNonLocked,
Collection<? extends GrantedAuthority> authorities)
あるいは、他の2つを区別する方法はないのでしょうか?それとも、サポートされていないので、自作するしかないのでしょうか?
解決方法は?
GrantedAuthorityは、quot;permission"またはquot;right"であるとお考えください。これらの "permission"は、(通常は)文字列として表現されます(permission".phpの代わりに
getAuthority()
メソッド)を使用します。これらの文字列によってパーミッションを特定し、それが何かへのアクセスを許可しているかどうかを投票者に判断させることができます。
セキュリティコンテキストに入れることで、ユーザーに異なるGrantedAuthority(アクセス権)を付与することができます。通常、これを行うには、必要なGrantedAuthorityを返すUserDetailsの実装を行う、独自のUserDetailsServiceを実装する必要があります。
ロール (多くの例で使用されています) は、単に "permissions" という命名規則で、ロールはプレフィックス
ROLE_
. それ以上のことはありません。ロールは単にGrantedAuthority、つまりquot;permission"、つまりquot;right"です。春のセキュリティでは、多くの場所でロールに
ROLE_
プレフィックスは特別に扱われます。
ROLE_
がデフォルトで使用されます。これにより、ロール名を指定する際に
ROLE_
という接頭辞があります。Spring security 4以前では、このquot;roles"の特別な扱いはあまり一貫して守られておらず、権限とロールはしばしば同じように扱われていました (たとえば
hasAuthority()
メソッドを
SecurityExpressionRoot
- を呼び出すだけです。
hasRole()
). Spring Security 4では、ロールの扱いがより一貫しており、"ロール"を扱うコード(例えば、?
RoleVoter
は、その
hasRole
式など)は常に
ROLE_
というプレフィックスを付けます。ですから
hasAuthority('ROLE_ADMIN')
と同じ意味です。
hasRole('ADMIN')
なぜなら
ROLE_
のプレフィックスが自動的に追加されます。春のセキュリティ3〜4参照
移行ガイド
をご覧ください。
しかし、それでも、ロールは単なる権限であり、特別な
ROLE_
という接頭辞があります。ですから、Spring security 3では
@PreAuthorize("hasRole('ROLE_XYZ')")
と同じです。
@PreAuthorize("hasAuthority('ROLE_XYZ')")
で、Spring security 4では
@PreAuthorize("hasRole('XYZ')")
と同じです。
@PreAuthorize("hasAuthority('ROLE_XYZ')")
.
ユースケースについてですが
ユーザーにはロールがあり、ロールは特定の操作を行うことができます。
で終わる可能性があります。
GrantedAuthorities
は、ユーザーが所属するロールと、ロールが実行できる操作に使用されます。その
GrantedAuthorities
は、ロールの接頭辞
ROLE_
という接頭辞を持ち、オペレーションは
OP_
. 操作権限の例としては、以下のようなものがあります。
OP_DELETE_ACCOUNT
,
OP_CREATE_USER
,
OP_RUN_BATCH_JOB
などです。ロールは
ROLE_ADMIN
,
ROLE_USER
,
ROLE_OWNER
などです。
をエンティティに実装させることができます。
GrantedAuthority
この(擬似的な)コードの例のように。
@Entity
class Role implements GrantedAuthority {
@Id
private String id;
@ManyToMany
private final List<Operation> allowedOperations = new ArrayList<>();
@Override
public String getAuthority() {
return id;
}
public Collection<GrantedAuthority> getAllowedOperations() {
return allowedOperations;
}
}
@Entity
class User {
@Id
private String id;
@ManyToMany
private final List<Role> roles = new ArrayList<>();
public Collection<Role> getRoles() {
return roles;
}
}
@Entity
class Operation implements GrantedAuthority {
@Id
private String id;
@Override
public String getAuthority() {
return id;
}
}
データベースに作成したロールやオペレーションのidは、例えばGrantedAuthorityの表現になります。
ROLE_ADMIN
,
OP_DELETE_ACCOUNT
などがあります。ユーザーが認証されたとき、そのロールのすべてのGrantedAuthoritiesと対応する操作がUserDetails.getAuthorities()メソッドから返されることを確認することです。
例
管理者ロールのID
ROLE_ADMIN
には、以下の操作があります。
OP_DELETE_ACCOUNT
,
OP_READ_ACCOUNT
,
OP_RUN_BATCH_JOB
が割り当てられています。
ユーザーロールに id
ROLE_USER
は、操作
OP_READ_ACCOUNT
.
管理者がログインした場合、生成されるセキュリティコンテキストはGrantedAuthoritiesを持つことになります。
ROLE_ADMIN
,
OP_DELETE_ACCOUNT
,
OP_READ_ACCOUNT
,
OP_RUN_BATCH_JOB
ユーザーがログを取ると、それがあります。
ROLE_USER
,
OP_READ_ACCOUNT
UserDetailsServiceは、すべてのロールとそのロールのすべての操作を収集し、返されたUserDetailsインスタンスのgetAuthorities()メソッドで利用可能にするように配慮しています。
関連
-
[解決済み] Spring Data JPAにおけるCrudRepositoryとJpaRepositoryのインターフェースの違いは何ですか?
-
[解決済み] maven. -source 1.5ではラムダ式がサポートされていません。
-
[解決済み] 午前0時からの時間を秒単位で取得する方法
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Javaにおけるpublic、protected、package-private、privateの違いは何ですか?
-
[解決済み] StringBuilderとStringBufferの違いについて
-
[解決済み] wait()とsleep()の違いについて
-
[解決済み] JDKとJREの違いは何ですか?
-
[解決済み] springの@Controllerアノテーションと@RestControllerアノテーションの違いについて
-
[解決済み】HashMap、LinkedHashMap、TreeMapの違いについて
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] tempとは何ですか、またjavaにおけるtempの用途は何ですか?
-
[解決済み] 未処理の例外タイプIOException」が表示されるのですが?
-
[解決済み] ボタンでTextFieldをクリアする(Java)
-
[解決済み] Cloneable throws CloneNotSupportedException
-
[解決済み] なぜJPAには@Transientアノテーションがあるのですか?
-
[解決済み] java.lang.IncompatibleClassChangeError: Mongo クラスを実装しています。
-
[解決済み] mavenのコンパイルに失敗するのはなぜですか?
-
[解決済み] ファイルを作成せずに、ファイルが存在するかどうかをチェックする
-
[解決済み] 文字列の長さに応じて文字列をトリミングする
-
[解決済み] Javaコンパイラーエラー:ステートメントではありません