有没有办法检查是否存在特定SessionId的Laravel Session

时间:2018-04-30 06:31:39

标签: php laravel laravel-5 laravel-5.1

当用户更改密码时,我想使其所有其他会话(当前的会话除外)无效,从而从所有其余设备注销用户,为此,我跟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 ,我们可以使用sessionIdsAPI)获取SessionId,但有没有办法检查Session是否包含任何特定{{1}是否存在?

我见过Laravel,通过用\Illuminate\Support\Facades\Session::getId()命名来创建会话文件,所以作为最后一个选项,我可以检查是否sessionId,但我想知道是否还有其他方式围绕?

1 个答案:

答案 0 :(得分:0)

如果您正在使用Laravel 5.6及更高版本,它可以让您开箱即用。 You can read the documentation on it here但这是它的要点。

首先,将\Illuminate\Session\Middleware\AuthenticateSession::class添加到中间件堆栈。它应该已经存在但是已经注释掉了(它是如何在Laravel中发布的)。然后,当用户更改密码时,您应将其传递到Auth::logoutOtherDevices($password)

Laravel在会话中保留密码的哈希副本,因此当密码更改时,中间件将强制注销具有旧密码哈希的任何会话。使用这种内置功能而不是试图自己动手更好。