webwings / mysql-session-handler
带可选加密存储的Nette框架MySQL会话处理器
v3.0.0
2021-04-26 19:57 UTC
Requires
- php: >=7.3
- nette/di: >=2.4
- nette/utils: >=2.4
Suggests
- spaze/encryption: Adds a support for encrypted session storage
README
为 Nette框架 定制的PHP会话处理器,使用MySQL数据库进行存储。
要求
- nette/utils 2.4+
- PHP 7.3+
安装
安装webwings/mysql-session-handler的首选方式是使用 Composer
$ composer require webwings/mysql-session-handler
设置
安装后
-
使用sql/create.sql中的SQL创建表sessions。
-
在config.neon中注册一个扩展
extensions: sessionHandler: Webwings\Session\DI\MysqlSessionHandlerExtension
- 设置DatabaseStorage
sessionHandler: storage: Webwings\Session\Storage\DibiDatabaseStorage(@dibi.connection, 'sessions')
特性
- 出于安全考虑,会话ID以SHA-256哈希的形式存储在数据库中。
- 支持通过 spaze/encryption 加密会话存储,它使用 paragonie/halite,而 Sodium 用于加密。
- 允许您向会话存储表添加额外列的事件。
- 多主复制友好(在主-主行复制设置中进行了测试)。
加密的会话存储
按照spaze/encryption中的指南定义一个新的加密密钥。
定义一个新的服务
sessionEncryption: \Spaze\Encryption\Symmetric\StaticKey('session', %encryption.keys%, %encryption.activeKeyIds%)
将新的加密服务添加到会话处理器中
sessionHandler:
encryptionService: @sessionEncryption
从未加密的会话存储迁移到加密的会话存储尚不支持。
事件
onBeforeDataWrite
该事件在会话数据写入会话表之前发生,无论是新会话(当插入新行时)还是现有会话(行被更新)。如果没有更改会话数据,只是更新会话时间戳,则不会触发此事件。
您可以在事件处理程序中调用setAdditionalData()来添加新列
setAdditionalData(string $key, $value): void
用它来存储例如用户ID,该ID属于会话。
致谢
本项目在很大程度上基于 MySQL Session handler,由 Pematon (Marián Černý & Peter Knut & Michal Špaček) 开发,谢谢!