2017-08-10 8 views
1

@Repository beanからSpring Securityコンテキストにアクセスすることは安全ですか?春セキュリティコンテキストと@Repository bean

私たちはいくつかの@Repository持っているとしましょう:

public interface FooService { 
    Foo getFoo(); 
} 

@Service  
public class FooServiceImpl { 
    @Autowired FooRep fooRep; 

    public Foo getFoo() { 
     return fooRep.getFoo(); 
    } 
} 

そして私たちは、このメソッドは、セキュリティで保護されたコントローラからアクセスされていることを言わせて、そのようなこと:それは、サービス層に包まれ

public interface FooRep { 
    Foo getFoo(); 
} 

@Repository 
public class FooRepImpl {  
    public Foo getFoo() { 
     Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); 
     return (Foo)authentication.getDetails(); 
    } 
} 

を:

@RestController 
@Secured 
public void FooController { 
    @Autowired FooService fooSer; 

    @RequestMapping("/foo"); 
    public Foo getFoo() { 
     return fooSer.getFoo(); 
    } 
} 

これは非常に単純化された例ですが、必須のpa論理のrtがここにあります。

なぜ私はそれが必要なのか、私にこのアーキテクチャの再構築方法のアドバイスはしないでください。

マルチスレッドの使用に関連する問題が発生する可能性はありますか?

authentication.getDetails()には、認証インターセプタに配置されているものと異なるFooインスタンスが含まれていた経験があるため、質問があります。これは非常に奇妙で不可能に見えます。

答えて

0

たとえば、次のような場合があります。リクエストにアクセスできないジョブは認証情報にアクセスできませんが、ジョブは引き続きリポジトリを使用します。

新しいスレッドを作成し、そのスレッドから再度リポジトリにアクセスすると問題が発生する可能性があります。

+0

私が提供したシナリオ(コントローラ - >サービス - >リポジトリ)とどのように説明したシナリオが一致しますか? – Andremoniy

+0

シンプルなケースでは問題ありませんが、マルチスレッドについて質問しました。潜在的な問題について説明しました。一般的には、レイヤーを保つ方が、コントローラからの認証を取得し、直接アクセスではなくパラメータとしてリポジトリへのサービスに移行することができます。 – StanislavL

関連する問題