web-dev-qa-db-ja.com

Spring Securityにおける役割と権限付与の違い

Spring Securityには、アクセスを許可/制御するための権限を取得するためのGrantedAuthorityインターフェースなどの概念と実装があります。

createSubUsers、またはdeleteAccountsのような許可された操作にしてください。これは、管理者に許可します(ロールROLE_ADMIN)。

私がオンラインで見るチュートリアル/デモとして混乱しています。私は自分が読んだものをつなげようとしますが、私たちはこの2つを互換的に扱うと思います。

hasRoleGrantedAuthority文字列を消費しているのがわかりますか。私は間違いなくそれを理解しています。 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つを区別するための他の方法はありますか?それともサポートされていないのですか?

194
Chinmay

GrantedAuthorityは、「許可」または「権利」であると考えてください。これらの「許可」は、(通常)文字列として表されます(getAuthority()メソッドを使用)。これらの文字列により、権限を識別し、投票者が何かへのアクセスを許可するかどうかを決定できます。

ユーザーをセキュリティコンテキストに入れることで、ユーザーにさまざまなGrantedAuthority(権限)を付与できます。通常は、必要なGrantedAuthoritiesを返すUserDetails実装を返す独自のUserDetailsS​​erviceを実装することでそれを行います。

役割(多くの例で使用されている)は、役割が接頭辞ROLE_で始まるGrantedAuthorityであるという命名規則を持つ単なる「許可」です。これ以上何もありません。役割は、GrantedAuthority-「許可」-「権利」です。春のセキュリティには、ROLE_プレフィックスを持つロールが特別に処理される多くの場所があります。 RoleVoterでは、ROLE_プレフィックスがデフォルトとして使用されます。これにより、ROLE_プレフィックスなしでロール名を提供できます。 Springセキュリティ4より前は、この「ロール」の特別な処理はあまり一貫性がなく、権限とロールはしばしば同じように扱われていました(たとえば hasAuthority()メソッドの実装で見ることができます) SecurityExpressionRoot -単にhasRole())を呼び出します。 Spring Security 4では、ロールの処理がより一貫しており、「ロール」(RoleVoterhasRole式など)を処理するコードは常に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_ACCOUNTOP_CREATE_USEROP_RUN_BATCH_JOBetcがあります。ロールには、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が含まれます。

UserDetailsS​​erviceは、すべてのロールとそれらのロールのすべての操作を収集し、返されたUserDetailsインスタンスのメソッドgetAuthorities()によってそれらを使用可能にすることに注意します。

320
James

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で使用することで、このデフォルトの動作を変更できます。

7
coder

これらの概念間の関係を理解するもう1つの方法は、役割を権限のコンテナーとして解釈することです。

権限は、特定のデータ範囲またはコンテキストと組み合わされた特定のアクションを対象としたきめ細かい権限です。たとえば、読み取り、書き込み、管理は、特定の範囲の情報に対するさまざまなレベルの権限を表すことができます。

また、権限が要求の処理フローの中で深く強制されているのに対し、ROLEは要求フィルター方式によってフィルターにかけられてからコントローラーに到達します。ベストプラクティスでは、ビジネスレイヤの管理者を超えて当局の執行を実施することを規定しています。

一方、ROLESは権限のセットを粗粒度で表現したものです。 ROLE_READERは読み取りまたは表示権限のみを持ち、ROLE_EDITORは読み取りと書き込みの両方を持ちます。ロールは主にhttpなどのリクエスト処理の郊外での最初のスクリーニングに使用されます。 ... .antMatcher(...)。hasRole(ROLE_MANAGER)

要求のプロセスフローの深いところで執行されている当局は、許可のよりきめの細かい適用を可能にします。たとえば、ユーザーは、リソースを最初のレベルに設定するための読み取り/書き込み権限を持っていても、サブリソースには読み取り権限しかない場合があります。 ROLE_READERを持つと、このリソースを編集するための書き込み権限が必要になるため、最初のレベルのリソースを編集する権限が制限されますが、@ Prereuthorizeインターセプタはサブリソースを編集するための暫定をブロックできます。

ジェイク

3
softjake