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