2017-08-10 112 views
1

@Repository bean訪問Spring Security上下文安全嗎?Spring安全上下文和@Repository bean

讓我們說,我們有一些@Repository

public interface FooRep { 
    Foo getFoo(); 
} 

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

它包裝成服務層:

public interface FooService { 
    Foo getFoo(); 
} 

@Service  
public class FooServiceImpl { 
    @Autowired FooRep fooRep; 

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

讓我們說,這種方法是從安全控制器訪問,類似的東西:

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

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

這是一個非常簡化的例子,但基本的pa邏輯的rt在這裏。

請不要問我爲什麼需要它,不要給我建議如何重構這個架構。

我只需要知道,它是否會導致與多線程使用有關的任何問題?

問題出現了,因爲我們遇到了authentication.getDetails()包含的Foo實例與驗證攔截器中放置的實例不同的情況。這很奇怪,看起來不可能。

回答

0

有些情況下,例如,無法訪問請求的作業,因此無法訪問認證信息,但作業仍使用存儲庫。

如果您創建新線程並再次從線程訪問存儲庫可能是一個問題。

+0

不好意思,你描述的場景如何與我提供的場景(Controller - > Service - > Repository)一致? – Andremoniy

+0

在簡單的情況下,它很好,但你問了關於多線程。我描述了潛在的問題。通常情況下,保留圖層比較好,以便您可以從控制器獲取身份驗證,並將其傳遞到服務器,並作爲參數傳遞給存儲庫,而不是直接訪問。 – StanislavL

相關問題