1. ホーム

[解決済み】Spring SecurityのRoleとGrantedAuthorityの違いについて

2022-04-16 07:49:14

質問

Spring Securityには、以下のような概念と実装があります。 GrantedAuthority インターフェイスを使用して 権限 を使用して、アクセスを認可/制御します。

というような許容される操作にしてほしいです。 サブユーザを作成する または アカウント削除 を許可します。 管理者 (ロール ROLE_ADMIN ).

ネットでチュートリアルやデモを見るにつけ、混乱してきました。私は読んだことを結びつけようとしていますが、この2つを互換的に扱っているように思います。

なるほど hasRole を消費して GrantedAuthority 文字列?私は間違いなく理解を間違えています。Spring Securityでは、これらは概念的に何ですか?

ユーザーのロールを、そのロールの権限とは別に保存するにはどうすればよいですか?

また、私は org.springframework.security.core.userdetails.UserDetails インターフェースは、認証プロバイダを参照する DAO で使用されるもので、これは User (最後のGrantedAuthorityに注意)。

public User(String username, 
            String password, 
            boolean enabled, 
            boolean accountNonExpired,
            boolean credentialsNonExpired, 
            boolean accountNonLocked, 
            Collection<? extends GrantedAuthority> authorities)

あるいは、他の2つを区別する方法はないのでしょうか?それとも、サポートされていないので、自作するしかないのでしょうか?

解決方法は?

GrantedAuthorityは、quot;permission"またはquot;right"であるとお考えください。これらの "permission"は、(通常は)文字列として表現されます(permission".phpの代わりに getAuthority() メソッド)を使用します。これらの文字列によってパーミッションを特定し、それが何かへのアクセスを許可しているかどうかを投票者に判断させることができます。

セキュリティコンテキストに入れることで、ユーザーに異なるGrantedAuthority(アクセス権)を付与することができます。通常、これを行うには、必要なGrantedAuthorityを返すUserDetailsの実装を行う、独自のUserDetailsServiceを実装する必要があります。

ロール (多くの例で使用されています) は、単に "permissions" という命名規則で、ロールはプレフィックス ROLE_ . それ以上のことはありません。ロールは単にGrantedAuthority、つまりquot;permission"、つまりquot;right"です。春のセキュリティでは、多くの場所でロールに ROLE_ プレフィックスは特別に扱われます。 ROLE_ がデフォルトで使用されます。これにより、ロール名を指定する際に ROLE_ という接頭辞があります。Spring security 4以前では、このquot;roles"の特別な扱いはあまり一貫して守られておらず、権限とロールはしばしば同じように扱われていました (たとえば hasAuthority() メソッドを SecurityExpressionRoot - を呼び出すだけです。 hasRole() ). Spring Security 4では、ロールの扱いがより一貫しており、"ロール"を扱うコード(例えば、? RoleVoter は、その hasRole 式など)は常に ROLE_ というプレフィックスを付けます。ですから hasAuthority('ROLE_ADMIN') と同じ意味です。 hasRole('ADMIN') なぜなら ROLE_ のプレフィックスが自動的に追加されます。春のセキュリティ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 などです。ロールは 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()メソッドで利用可能にするように配慮しています。