管理者は、ユーザーの入場を無効または一時停止できます。
「ユーザーログイン」で「ユーザーが無効になっているか」を確認できます。(「リクエストごとにDbをチェックする」は適切なオプションではありません)
そのため、管理者がアカウントを無効にしたときにユーザーのセッションを削除したいと考えています。
どうすればそれを達成できますか?
管理者は、ユーザーの入場を無効または一時停止できます。
「ユーザーログイン」で「ユーザーが無効になっているか」を確認できます。(「リクエストごとにDbをチェックする」は適切なオプションではありません)
そのため、管理者がアカウントを無効にしたときにユーザーのセッションを削除したいと考えています。
どうすればそれを達成できますか?
知っているか保持しているsessionId
場合は、次の方法でキャッシュからセッションを削除できます。
using (var cache = TryResolve<ICacheClient>())
{
var sessionKey = SessionFeature.GetSessionKey(sessionId);
cache.Remove(sessionKey);
}
ただし、ServiceStack はすべてのユーザーのセッション ID 自体のマップを保持しているわけではありません。各リクエストでの DB ルックアップを回避する 1 つの方法は、アカウントを無効にするときに、無効になっているユーザー 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 が追加され、これによりこれが少し改善されました (v4.0.34 以降):
if (cache.Get<string>("locked-user:" + session.UserAuthId) != null)
req.RemoveSession(session.Id);