sylae/doctrine-dbal-session-handler

使用 doctrine/dbal 实现的 SessionHandlerInterface

v0.2 2022-09-09 12:15 UTC

This package is auto-updated.

Last update: 2024-09-06 23:36:31 UTC


README

此包提供了一个类 \Doctrine\DBAL\DBALSessionHandler,它允许您以尽可能少的努力将您的会话存储到 SQL 数据库中。

目前,它只在 mysql8 上进行了测试,但它应该适用于任何其他情况。唯一的难点是 REPLACE INTO 命令,但这很容易通过 pull-request 来解决 :p

使用示例

$db = \Doctrine\DBAL\DriverManager::getConnection(/* or whatever */);

$sessionHandler = new \Doctrine\DBAL\DBALSessionHandler($db);
$sessionHandler->setSessionTable("whatever"); // defaults to "sessions" if not called
session_set_save_handler($sessionHandler, true);

默认情况下,我们还存储了这些会话的 IP 地址和用户代理,与实际的会话数据一起。此外,您可以通过传递一个可调用来提供用户 ID。这是为了方便用户查看他们账户上活跃的会话,并通过您的网站撤销它们。

$sessionHandler->setUserIDHandler(function (): ?int {
    return $this->user->id ?? null; // or wherever you keep your user ID.
});

目前它不会为您进行任何高级的表管理,因此您需要执行一些 SQL 命令。

/* minimum you can get away with */
CREATE TABLE `sessions`
(
    `idSession` char(64) NOT NULL,
    `data`      text,
    `ip`        binary(16)      DEFAULT NULL,
    `userAgent` varchar(255)    DEFAULT NULL,
    `idUser`    bigint unsigned DEFAULT NULL, /* change size as needed, this is just what i use */
    PRIMARY KEY (`idSession`),
);

/* what i use */
CREATE TABLE `sessions`
(
    `idSession` char(64) NOT NULL,
    `updated`   datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    `created`   datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
    `data`      text,
    `ip`        binary(16)        DEFAULT NULL,
    `userAgent` varchar(255)      DEFAULT NULL,
    `idUser`    bigint unsigned   DEFAULT NULL,
    PRIMARY KEY (`idSession`),
    KEY `sessions_ibfk_1` (`idUser`),
    CONSTRAINT `sessions_ibfk_1` FOREIGN KEY (`idUser`) REFERENCES `users` (`idUser`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8mb4
  COLLATE = utf8mb4_0900_ai_ci;