2017-09-12 35 views
0

我正在使用spring引導創建無狀態的REST API。 因此,我正在使用基於令牌的身份驗證。Spring Security從無狀態服務器註銷

當前註銷功能只在客戶端實現。 我只是清除所有的餅乾。

問題是用戶對象似乎在請求中生存下來,所以它仍然存在於下一個請求中。 我的服務來獲得當前用戶很簡單:

@Service 
public class UserService { 
    private User user; 

    @Autowired 
    private UserRepository; 

    public User get() { 
    if (user != null) { 
     return user; 
    } 
    Integer id = (Integer) SecurityContextHolder.getContext().getAuthentication().getPrincipal(); 
    user = userRepository.findById(id); 
    return user; 
    } 
} 

我希望用戶變量爲空每個請求?有趣的是,在安全上下文中設置了正確的用戶標識。但是服務返回用戶對象,因爲它已經存在。

回答

1

您不應該將用戶用作類屬性。

UserService是一個單例,當有來自不同用戶的併發請求時會發生什麼? 在get方法內移動這個變量。

此外,如果您使用JWT作爲基於令牌的身份驗證,請查看此project

使用JWT,您可以直接從令牌檢索用戶所需的信息,而無需執行任何查詢。

+0

但即使服務是一個單身人士,我期望單身人士的生命期只是請求約束。春天似乎在緩存單身人士的服務?否則我無法想象下一個請求中用戶屬性的存在方式。 – user3481997

+0

默認情況下,如果僅指定註釋** Service **,則每次只能有一個UserService類(該類只有一個實例)。您可以通過註釋** Scope **指定bean的範圍,但我不推薦此解決方案。 – desoss

+0

但是這是通過多個請求共享的一個實例嗎? – user3481997