web-dev-qa-db-ja.com

Springの@Securedと@RolesAllowedの違いは?そして、役割ベースのセキュリティの概念は?

私はSpringSecurityを研究していますが、@ Securedアノテーションと@ RolesAllowedアノテーションの使用の違いに関連して次の疑問があります。

両方をメソッドレベルで使用する必要があることを知っています。私の学習資料では、次の2つの例を見つけました。

  • @ RolesAllowedアノテーション:

    import javax.annotation.security.RolesAllowed;    
    public class ItemManager {
        @RolesAllowed("ROLE_MEMBER")
        public Item findItem(long itemNumber) {
            ...
        }
    }
    
  • @ Securedアノテーション:

    import org.springframework.security.annotation.Secured;
    public class ItemManager {
        @Secured("ROLE_MEMBER")
        public Item findItem(long itemNumber) {
            ...
        }
    }
    

これらの2つの注釈は同じように機能するように私には思えます。違いは何ですか?何が足りないのですか?

私が持っているもう1つの疑問は、ROLE_MEMBERを正確に表すものは何ですか?

これはロールベースのセキュリティのようなものだと思うので、次のような意味になる可能性があります:ユーザーがメンバーである場合にのみ、注釈付きリソースにアクセスできます(正しいですか?)。しかし、ユーザーがこの役割を設定した(メンバーである)という事実はどこでどのように定義されますか?どのように正確に機能しますか?

Tnx

13
AndreaNobili

_@Secured_と_@RolesAllowed_は同じです。彼らは春に同じ操作をします。

だが

  • _@RolesAllowed_- Javaの標準アノテーション。

    JavaはJava仕様リクエスト、基本的にJava言語、ライブラリ、その他のコンポーネントのリクエストを変更します。開発用注釈の中で、JSR 250が提供されています。_@RolesAllowed_が含まれています。 このリンクにはJSR 250の詳細情報が含まれています

  • _@Secured_- Springセキュリティアノテーション

_ROLE_MEMBER_は、セキュリティユーザーの詳細に設定されるロールです。

私の現在のプロジェクトからこの例を参照してください。ここでは、ユーザーデータオブジェクトを使用して、ユーザーに与えられた役割をセキュリティユーザーの詳細にマッピングしています。

_public class CustomUserDetails implements UserDetails {
...
...
... 

    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        Collection<GrantedAuthority> grantedAuthorities = new ArrayList<GrantedAuthority>();
        for (Role role : this.user.getRoles()){
            grantedAuthorities.add(new SimpleGrantedAuthority(role.getRole()));
        }
        return grantedAuthorities;
    }
}
_

次に、これらのロールは、メソッドに_@Secured_または_@RolesAllowed_または@PreAuthorize("hasRole('ROLE_USER')")を使用してセキュリティ承認用に設定されます。

設計上、セキュリティをサービス層に配置することをお勧めします。したがって、サービスアクションを保護するときは、ユーザーではなくロールをチェックします。

このようにして、ロールと呼ばれる小さなセキュリティユニットを介して、ビジネスロジックとビジネスロジックのセキュリティに焦点を当てることができます。

次に、ユーザーに役割を割り当てます。ユーザーは複数の役割を持つことができます。したがって、ここで関係を確認する必要があります。ユーザーには役割が与えられます。また、ロールにはビジネスロジックへのアクセス権が与えられます。ユーザーには、ロールを介してビジネスロジックへのアクセス権が付与されます。この概念は、ロールベースのアクセス制御と呼ばれます。

そして、複雑な状況では、階層的な役割を管理することもできます。 1つの役割に他の多くの役割がある場合。ただし、UserDetailsでは、ロール階層をフラット化し、ロールのリストをSpringフレームワークに提供して処理する必要があります。

29
Faraj Farook

受け入れられた答えは完全に質問に答えます(笑)、しかしこれは言うのに良い場所だと思いますSpringでメソッドレベルのセキュリティを有効にする方法

追加する必要があるのは、次のプロパティがtrue(デフォルトはfalse)に設定された構成クラス(例を参照)の@EnableGlobalMethodSecurityアノテーションだけです。

  • securedEnabled(SpringのSecuredアノテーションを有効にします。)、
  • jsr250EnabledJSR-250標準 Java RolesAllowedなどのセキュリティアノテーションを有効にします)、
  • prePostEnabled(SpringのPreAuthorizeおよびPostAuthorizeアノテーションを有効にします)。

注釈の使用例:

@EnableGlobalMethodSecurity(
    securedEnabled = true,
    jsr250Enabled = true,
    prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
// ...
@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()
        .anyRequest().fullyAuthenticated()
        .and()
        .formLogin(); // You probably need more than this
}

@Override
public void configure(AuthenticationManagerBuilder auth) throws Exception {
    // your authentication manager config here
}

より詳細な例については、 Spring Security Method Level Annotations Example を参照してください。

14
Aleksandar