当用户更改密码时,我想使其所有其他会话(当前的会话除外)无效,从而从所有其余设备注销用户,为此,我跟this answer's strategy public static FileStream Open(string channelName, WTS_CHANNEL_OPTION option = WTS_CHANNEL_OPTION.DYNAMIC)
{
// Open
SafeFileHandle pFile = null;
using (var sfh = WTSVirtualChannelOpenEx(WTS_CURRENT_SESSION, channelName, option))
{
WtsAllocSafeHandle pBuffer = null;
try
{
int cbReturned;
if (!WTSVirtualChannelQuery(sfh, WTS_VIRTUAL_CLASS.FileHandle, out pBuffer, out cbReturned)
|| cbReturned < IntPtr.Size)
{
throw new Win32Exception();
}
var pWtsFile = Marshal.ReadIntPtr(pBuffer.DangerousGetHandle());
if (!DuplicateHandle(
GetCurrentProcess(), pWtsFile,
GetCurrentProcess(), out pFile,
0, false, DUPLICATE_SAME_ACCESS))
{
throw new Win32Exception();
}
}
finally
{
pBuffer?.Dispose();
}
}
// create
return new FileStream(pFile, FileAccess.ReadWrite, bufferSize: 32 * 1024 * 1024, isAsync: true);
}
通过在数据库中仅存储用户的file driver
来跟踪用户的会话。
现在,使用 Laravel 5.1 ,我们可以使用sessionIds
(API)获取SessionId,但有没有办法检查Session是否包含任何特定{{1}是否存在?
我见过Laravel,通过用\Illuminate\Support\Facades\Session::getId()
命名来创建会话文件,所以作为最后一个选项,我可以检查是否sessionId
,但我想知道是否还有其他方式围绕?
答案 0 :(得分:0)
如果您正在使用Laravel 5.6及更高版本,它可以让您开箱即用。 You can read the documentation on it here但这是它的要点。
首先,将\Illuminate\Session\Middleware\AuthenticateSession::class
添加到中间件堆栈。它应该已经存在但是已经注释掉了(它是如何在Laravel中发布的)。然后,当用户更改密码时,您应将其传递到Auth::logoutOtherDevices($password)
。
Laravel在会话中保留密码的哈希副本,因此当密码更改时,中间件将强制注销具有旧密码哈希的任何会话。使用这种内置功能而不是试图自己动手更好。