私は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
_@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フレームワークに提供して処理する必要があります。
受け入れられた答えは完全に質問に答えます(笑)、しかしこれは言うのに良い場所だと思いますSpringでメソッドレベルのセキュリティを有効にする方法。
追加する必要があるのは、次のプロパティがtrue
(デフォルトはfalse
)に設定された構成クラス(例を参照)の@EnableGlobalMethodSecurity
アノテーションだけです。
securedEnabled
(SpringのSecured
アノテーションを有効にします。)、jsr250Enabled
( JSR-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 を参照してください。