GrantedAuthority を「許可」または「権利」と考えてください。これらの「許可」は、(通常) 文字列として (getAuthority()
メソッドを使用して) 表現されます。これらの文字列により、アクセス許可を識別し、有権者に何かへのアクセスを許可するかどうかを決定させることができます。
ユーザーをセキュリティ コンテキストに入れることで、さまざまな GrantedAuthority (権限) をユーザーに付与できます。これは通常、必要な GrantedAuthorities を返す UserDetails 実装を返す独自の UserDetailsService を実装することによって行います。
役割 (多くの例で使用されているように) は、役割が接頭辞 で始まる GrantedAuthority であるという命名規則を持つ単なる「許可」ROLE_
です。もう何もありません。役割は単に GrantedAuthority - 「許可」 - 「権利」です。ROLE_
Spring セキュリティでは、プレフィックスがデフォルトとして使用される RoleVoter など、プレフィックスを持つロールが特別に処理される場所がたくさんありROLE_
ます。ROLE_
これにより、プレフィックスなしでロール名を指定できます。Spring security 4 より前では、この「ロール」の特別な処理はあまり一貫して行われておらず、権限とロールはしばしば同じように扱われていました (たとえば、hasAuthority()
hasRole()
)。Spring Security 4 では、ロールの処理がより一貫しており、「ロール」 ( RoleVoter
、式など) を処理するコードは常にプレフィックスをhasRole
追加します。ROLE_
Soは、プレフィックスが自動的に追加されるため、hasAuthority('ROLE_ADMIN')
と同じことを意味します。詳細については、Spring Security 3 から 4への移行ガイドを参照してください。hasRole('ADMIN')
ROLE_
ROLE_
ただし、役割は特別な接頭辞が付いた単なる権限です。したがって、Spring セキュリティ 3@PreAuthorize("hasRole('ROLE_XYZ')")
は と同じで@PreAuthorize("hasAuthority('ROLE_XYZ')")
あり、Spring セキュリティ 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;
}
}
ROLE_ADMIN
データベースで作成する役割と操作の ID は、GrantedAuthority 表現 (例: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() によってそれらを利用できるようにします。