Spring Securityには、アクセスを許可/制御するための権限を取得するためのGrantedAuthority
インターフェースなどの概念と実装があります。
createSubUsers、またはdeleteAccountsのような許可された操作にしてください。これは、管理者に許可します(ロールROLE_ADMIN
)。
私がオンラインで見るチュートリアル/デモとして混乱しています。私は自分が読んだものをつなげようとしますが、私たちはこの2つを互換的に扱うと思います。
hasRole
がGrantedAuthority
文字列を消費しているのがわかりますか。私は間違いなくそれを理解しています。 Spring Securityの概念的なこれらは何ですか?
その役割の権限とは別に、ユーザーの役割を保管するにはどうすればよいですか?
私はまた、User
を消費する認証プロバイダ参照DAOで使用されているorg.springframework.security.core.userdetails.UserDetails
インタフェースを見ています。
public User(String username,
String password,
boolean enabled,
boolean accountNonExpired,
boolean credentialsNonExpired,
boolean accountNonLocked,
Collection<? extends GrantedAuthority> authorities)
それとも他の2つを区別するための他の方法はありますか?それともサポートされていないのですか?
GrantedAuthorityは、「許可」または「権利」であると考えてください。これらの「許可」は、(通常)文字列として表されます(getAuthority()
メソッドを使用)。これらの文字列により、権限を識別し、投票者が何かへのアクセスを許可するかどうかを決定できます。
ユーザーをセキュリティコンテキストに入れることで、ユーザーにさまざまなGrantedAuthority(権限)を付与できます。通常は、必要なGrantedAuthoritiesを返すUserDetails実装を返す独自のUserDetailsServiceを実装することでそれを行います。
役割(多くの例で使用されている)は、役割が接頭辞ROLE_
で始まるGrantedAuthorityであるという命名規則を持つ単なる「許可」です。これ以上何もありません。役割は、GrantedAuthority-「許可」-「権利」です。春のセキュリティには、ROLE_
プレフィックスを持つロールが特別に処理される多くの場所があります。 RoleVoterでは、ROLE_
プレフィックスがデフォルトとして使用されます。これにより、ROLE_
プレフィックスなしでロール名を提供できます。 Springセキュリティ4より前は、この「ロール」の特別な処理はあまり一貫性がなく、権限とロールはしばしば同じように扱われていました(たとえば のhasAuthority()
メソッドの実装で見ることができます) SecurityExpressionRoot -単にhasRole()
)を呼び出します。 Spring Security 4では、ロールの処理がより一貫しており、「ロール」(RoleVoter
、hasRole
式など)を処理するコードは常にROLE_
プレフィックスを追加します。 ROLE_
プレフィックスが自動的に追加されるため、hasAuthority('ROLE_ADMIN')
はhasRole('ADMIN')
と同じ意味です。詳細については、スプリングセキュリティ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
etcがあります。ロールには、ROLE_ADMIN、ROLE_USERなどがあります。
この(擬似コード)例のように、エンティティにGrantedAuthority
を実装させることができます。
@Entity
class Role implements GrantedAuthority {
@Id
private String id;
@OneToMany
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;
@OneToMany
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の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()によってそれらを使用可能にすることに注意します。
AFAIK GrantedAuthorityとロールは春のセキュリティでも同じです。 GrantedAuthorityのgetAuthority()文字列はロールです(デフォルト実装のSimpleGrantedAuthorityによる)。
あなたの場合は、階層ロールを使用することができます
<bean id="roleVoter" class="org.springframework.security.access.vote.RoleHierarchyVoter">
<constructor-arg ref="roleHierarchy" />
</bean>
<bean id="roleHierarchy"
class="org.springframework.security.access.hierarchicalroles.RoleHierarchyImpl">
<property name="hierarchy">
<value>
ROLE_ADMIN > ROLE_createSubUsers
ROLE_ADMIN > ROLE_deleteAccounts
ROLE_USER > ROLE_viewAccounts
</value>
</property>
</bean>
あなたが探している正確なソルではありませんが、助けになることを願っています
編集:あなたのコメントに返信
役割は春の安全保障における許可のようなものです。 hasRoleでintercept-urlを使用することで、どのロール/パーミッションに対してどの操作が許可されているかをきめ細かく制御できます。
私たちのアプリケーションで処理する方法は、各操作(または残りのURL)に対して許可(つまり役割)を定義することです。 view_account、delete_account、add_accountなど。次に、admin、guest_user、normal_userなどの各ユーザーの論理プロファイルを作成します。プロファイルは、スプリングセキュリティとは無関係に、単に権限を論理的にグループ化したものです。新しいユーザーが追加されると、プロファイルが割り当てられます(許可されているすべての権限を持ちます)。これで、ユーザーが何らかのアクションを実行しようとしたときに、そのアクションの許可/役割がユーザーgrantAuthoritiesと照合されます。
また、デフォルトのRoleVoterはプレフィックスROLE_を使用するので、ROLE_で始まる権限はすべてロールと見なされます。ロール有権者にカスタムRolePrefixを使用し、それをSpring Securityで使用することで、このデフォルトの動作を変更できます。
これらの概念間の関係を理解するもう1つの方法は、役割を権限のコンテナーとして解釈することです。
権限は、特定のデータ範囲またはコンテキストと組み合わされた特定のアクションを対象としたきめ細かい権限です。たとえば、読み取り、書き込み、管理は、特定の範囲の情報に対するさまざまなレベルの権限を表すことができます。
また、権限が要求の処理フローの中で深く強制されているのに対し、ROLEは要求フィルター方式によってフィルターにかけられてからコントローラーに到達します。ベストプラクティスでは、ビジネスレイヤの管理者を超えて当局の執行を実施することを規定しています。
一方、ROLESは権限のセットを粗粒度で表現したものです。 ROLE_READERは読み取りまたは表示権限のみを持ち、ROLE_EDITORは読み取りと書き込みの両方を持ちます。ロールは主にhttpなどのリクエスト処理の郊外での最初のスクリーニングに使用されます。 ... .antMatcher(...)。hasRole(ROLE_MANAGER)
要求のプロセスフローの深いところで執行されている当局は、許可のよりきめの細かい適用を可能にします。たとえば、ユーザーは、リソースを最初のレベルに設定するための読み取り/書き込み権限を持っていても、サブリソースには読み取り権限しかない場合があります。 ROLE_READERを持つと、このリソースを編集するための書き込み権限が必要になるため、最初のレベルのリソースを編集する権限が制限されますが、@ Prereuthorizeインターセプタはサブリソースを編集するための暫定をブロックできます。
ジェイク