2012-04-03 10 views
0

私は、ユーザーの認証にSpring Securityを使用するWebアプリケーションを開発しています。 私はこの方法でログインしているユーザー得ることができることを知っている:春のセキュリティでログに記録されたユーザーを取得する最も良い方法は何ですか?

public class SecurityUtil { 
    public static User getCurrentUser() { 
     SecurityContextHolder.getContext().getAuthentication().getPrincipal() 
    } 
} 

を、このように正常に動作します。 質問は:この値にアクセスする最も良い方法は何ですか?にアクセスし

public class FooController { 

    @Autowired 
    private FooService fooService; 

    public void control() { 

     fooService.doSomething(SecurityUtil.getCurrentUser()); 
    } 
} 

3.User:パラメータがサービスに渡されたとして

public class FooController { 

    @Autowired 
    private FooService fooService; 

    private User u = SecurityUtil.getCurrentUser(); 

    @RequestMapping(...) 
    public void control() { 

     fooService.doSomething(u); 
    } 
} 

2.User:

1.Userは、コントローラ内の変数として宣言:私はいくつかの例を行いますサービス:

public class FooService { 

    public void doSomething() { 

     SecurityUtil.getCurrentUser(); 
     //Do something 
    } 
} 

すべての例が有効ですか?誰かを気まぐれに使うことはできますか?私が知っておくべきいくつかの欠点がありますか?

+0

どのバージョンのSpringを使用していますか? –

答えて

2

例1

例1は使用できません。他の答えが指摘しているように、スレッドセーフでもありません。

例2

例2は、ユニットテストではより多くのテスト可能で、それを行うには、私のお勧めの方法です。

@RequestMapping(method = RequestMethod.GET) 
public String index(Model m, HttpSession session, Principal principal) { 
    // principal.getName() return username 
    return "XYZ"; 
} 

例3

例3は、使用可能な、しかし簡単にテスト可能ではないし、維持するのは難しいです。しかし、私は参照して、使用にドキュメントhereを次の例(春3)を推薦します。

+0

本当ですか?あなたの例はSpring 3で動作しますか?私はそれを知らなかった...それは非常にエレガントです! – Fabio

+0

@Fabio、はい、それは春3で働いています、春のドキュメンテーションへのリンクで私の更新された答えを見てください –

0

例1はスレッドセーフではありません。一般に、サービスBeanはステートレスでなければなりません。

例3では、コントローラからFooServiceを呼び出す方法によって異なります。この呼び出しがアプリケーションの境界を超えている場合は、その呼び出しが動作するようにSpring SecurityContextが確実に伝播するようにする必要があります。

例2はすべての場合に問題ありませんが、現在のユーザーをサービスメソッドに渡すことは、問題の正確な分離のようではありません。デフォルトのSpring BeanはFooControllerが作成されるとき、User変数が正しく割り当てられたか、nullあるれていないことを意味するシングルトン、あるので

関連する問題