2011-08-08 15 views
2

現在のプロジェクトでは、JSFとSpring Frameworkを統合しています。私は、Spring Securityを使用して認証と承認を処理したいと考えています。これまでのところ、私はPasswordEncoderAccessDecisionVoterのカスタムを実装しています。今私は@Secured注釈を使用してメソッドを保護しようとしていますが、私はそれが期待しているように動作させることはできません。Springセキュリティによるメソッドの保護

注釈は、JSFレイヤーから直接呼び出されるBeanメソッドに対してのみ機能します。

@Named("foobarBean") 
@Scope("access") 
public class FoobarBean 
{ 
    @Secured("PERMISSION_TWO") 
    public void dummy() 
    { 
    } 

    @Secured("PERMISSION_ONE") 
    public String save() 
    { 
     dummy(); 
    } 
} 

)メソッド(SAVEこのようなJSF層から呼び出される:ここでは単純化した例です

<h:commandButton id="save" action="#{foobarBean.save}" /> 

当社AccessDecisionVoterその後、PERMISSION_ONEに投票するように求められますがPERMISSION_TWO上ないれます。これは設計どおりに動作していますか(そうではないことを望んでいますか)、何か間違っているのですか?

私はもっとコードや設定を投稿したいと思いますが、どの部分が関連しているのかわからないので、この投稿を混乱させたくありません。

答えて

2

プロキシAOPの単純な問題です! Proxy AOP for Securityを使用すると、プロキシはプロキシを経由するコールを傍受することしかできません。 1つのメソッドが同じBeanの他のメソッドを直接呼び出す場合、この呼び出しを代行できるプロキシはありません。 - これがセキュリティの注釈(save())のみが考慮される理由です。

解決策の1つは、プロキシAOPの代わりにAspectJ AOPを使用することです。 (これはSpring(Security)でもサポートされています)

1

はい、これがAccessDecisionVoterの仕組みです。リソース(あなたのケースではメソッド)上で許可されているすべてのロールを取り、それらのロールに投票して、現在の認証されたユーザーのロールを形成します。役割が一致する場合、権限のみが付与されます。

また、saveメソッドで定義されている唯一のロールはPERMISSION_ONEであるため、セキュリティシステムはこのロールに対してのみチェックします。ユーザーがログインしている場合は、このメソッドが実行されます。

+0

これはsave()メソッドが呼び出されていて、うまくいきました。しかしsave()は安全なメソッドであるdummy()を呼び出します。私は、メソッドdummy()が必要な権限をメソッドsave()によって呼び出されたときにチェックすることを期待しています... –

関連する問題