4

管理员可以禁用或暂停用户的入口。

我们可以在“用户登录”中检查“用户是否被禁用”。(“为每个请求检查 Db”不是好的选择)

所以我们想在管理员禁用它的帐户时删除用户的会话。

我们怎样才能实现它?

4

1 回答 1

5

如果您知道或保留了,sessionId您可以使用以下命令从缓存中删除会话:

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

但是 ServiceStack 本身并没有保留所有用户会话 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 ,这使它变得更好(从 v4.0.34+ 开始):

if (cache.Get<string>("locked-user:" + session.UserAuthId) != null)
    req.RemoveSession(session.Id);
于 2014-11-18T00:20:42.723 回答