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()でそれらを利用できるようにします。