0

現在、Web アプリケーションと REST サービスの 2 つのチャネルを持つ spring-mvc アプリケーションがあります。どちらにもユーザーの http セッションがあり、サービス クラスで「現在のユーザー」を簡単に取得できます。

ここで、http セッションがなく、現在のユーザーが要求パラメーターに依存する別の REST サービスを開発する必要があります。したがって、コントローラーはその要求パラメーターを読み取り、現在のユーザーを見つけます。

1.現在のユーザーをパラメーターとして受け入れるようにサービスレイヤーメソッドを変更するか、2.httpセッションから現在のユーザーを取得するクラスを変更するだけです。

また、監査ログを作成する必要があり、そのために Spring AOP を使用します。アスペクトは「現在のユーザー」にもアクセスする必要があります。したがって、オプション #1 はおそらく私にはうまくいかず、#2 を使用します。

オプション #2 では、現在のユーザーを ThreadLocal 変数に入れるインターセプターを作成します。新しい REST サービスのコントローラーは同じことを行い、サービス レイヤーと監査ログの側面で、そこから現在のユーザーを取得できます。

私は以前にこのようなことをしたことがなく、より良いアプローチがあるかどうか疑問に思っていました. または、このアプローチでどのような問題が予想されるか。

コメントやアイデアをいただければ幸いです。

オズ

現在、現在のユーザーを取得する方法は次のとおりです。

@Override
public User getCurrentUser()
{
    Authentication currentUser = getAuthentication();

    return userService.getByLoginName(currentUser.getName());
}


protected Authentication getAuthentication()
{
    return SecurityContextHolder.getContext().getAuthentication();
}
4

1 に答える 1

2

必要なことを行う簡単な方法は、新しい REST Web サービスのサーブレット フィルターを構成して、要求パラメーターからビルドされSecurityContextHolderたオブジェクトを設定することだと思います。Authentication

詳細については、http : //static.springsource.org/spring-security/site/docs/3.1.x/reference/springsecurity-single.html#d0e2171を参照してください。

このソリューションでは、現在のユーザーを取得するためにコードを変更する必要はありません。(SecurityContextHolderはすでに を使用してThreadLocalを格納してSecurityContextいることに注意してくださいAuthentication)

于 2013-08-14T10:32:13.747 に答える