2012-10-31 30 views
4

管理員可以禁用或暫停用戶的入口。我們如何刪除ServiceStack中的特定用戶會話?

我們可以在「用戶登錄」中檢查「is user disabled」。 (「檢查每個請求的Db」是不好的選擇)

所以我們想要刪除用戶的會話,當管理員禁用它的帳戶。

我們該如何實現它?

回答

5

如果您知道或保持sessionId可以從緩存中刪除一個會話使用:

using (var cache = TryResolve<ICacheClient>()) 
{ 
    var sessionKey = SessionFeature.GetSessionKey(sessionId); 
    cache.Remove(sessionKey); 
} 

但ServiceStack不保留地圖的所有用戶的會話ID本身。避免在每個請求上進行數據庫查找的一種方法是在禁用帳戶時記錄被禁用的用戶ID,您可以稍後在全局請求篩選器中驗證該用戶ID,以確保用戶未被鎖定。

存儲鎖定的用戶ID的最佳方式是在緩存中,鎖定用戶ID的可見性和生存期位於存儲會話的相同緩存中。您可以使用自定義緩存鍵記錄鎖定用戶ID,例如:

GlobalRequestFilters.Add((req, res, dto) => 
{ 
    var session = req.GetSession(); 
    using (var cache = TryResolve<ICacheClient>()) 
    { 
     if (cache.Get<string>("locked-user:" + session.UserAuthId) != null) 
     { 
      var sessionKey = SessionFeature.GetSessionKey(session.Id); 
      cache.Remove(sessionKey); 
      req.Items.Remove(ServiceExtensions.RequestItemsSessionKey); 
     } 
    } 
}); 

這將嘗試訪問ServiceStack下一次刪除鎖定用戶會話,迫使他們重新登錄,在這一點上,他們會發現他們已被鎖定。

新RemoveSession API是added in this commit這使得這種更好一點(從v4.0.34 +):

if (cache.Get<string>("locked-user:" + session.UserAuthId) != null) 
    req.RemoveSession(session.Id);