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