1

Beanの1つに@Cacheable注釈付きメソッドがあり、現在ログインしているユーザーIDをキャッシュのキーとして使用したいと思います。ただし、Spring Securityを使用しており、このBeanのインスタンス変数としてInjectedサービスがあり、SecurityContextHolder.getContext()。getAuthentication()を呼び出してユーザーIDを返します。したがって、@Cacheableメソッドに引数なしのコンストラクターがあります。注入されたサービスのメソッドから返されたユーザーIDをキャッシュのキーとして使用する方法はありますか?

@Service
public class MyServiceImpl implements MyService {

@Inject
private UserContextService userContextService;

@Override
@Cacheable("myCache")
public String getInformation() {
  //use this as the key for the cache entry
String userId = userContextService.getCurrentUser();
return "something";
}
}

UserContextServiceの実装:

@Service
public class UserContextServiceImpl implements UserContextService {

public String getCurrentUser() {
return SecurityContextHolder.getContext().getAuthentication().getName();
}

}

この質問を見つけましたが、やりたいこととは少し異なります。この機能は静的メソッドでは不可能だと思います。

@Cacheableアノテーションを使用してSpringBeanをキーとして使用する

4

1 に答える 1

1

userIdがメソッドの引数になるようにこのクラスを記述しgetInformation()、メソッド/サービスパスのユーザーがID自体をルックアップできるようにします。

@Override
@Cacheable("myCache")
public String getInformation(String userId) { ... }

IMOサービスの有用性を制限するため、SpringSecurityコンテキストを直接使用するようにサービスレイヤーを作成することはお勧めできません-SpringSecurityを使用しないある種のRESTAPIを実装する場合(例として)、その場合getCurrentUser()、意味/戻り値がない可能性があります。そのMyServiceImplリクエストにSpringSecurityが使用されていない場合は使用できません。また、「管理者ユーザーはユーザーXの情報を検索する必要がある」などのサポートが必要な場合、このメソッドは使用できません。

Web向けのレイヤーに、サービスレイヤーではなく、セキュリティコンテキストからユーザーIDを抽出する方法について心配させてください。

于 2012-08-03T19:19:12.133 に答える