adbario / slim-secure-session-middleware
Slim 3 框架的安全会话中间件
1.3.4
2017-08-04 13:51 UTC
Requires
- php: >=5.5
- adbario/php-dot-notation: ~1.2.0
- paragonie/random_compat: ^2.0
- slim/slim: ~3.0
README
Slim 3 框架的安全会话中间件。
- 更长的更安全的会话 ID
- 会话数据加密
- 自动设置会话 cookie 路径、域名和安全性值
- 在每个用户活动后延长会话生命周期
- 使用命名空间和点表示法轻松处理会话值(点 - PHP 点表示法数组访问)
如果你在共享主机上并且使用会话来存储敏感数据,将会话文件存储在你的自定义位置并加密它们是个好主意。
安装
通过 composer
composer require adbario/slim-secure-session-middleware
配置
在你的应用程序设置中创建一个会话设置的数组。 请注意,会话生命周期是以分钟定义的,而不是以秒。 会话的默认设置
$settings = [
'session' => [
// Session cookie settings
'name' => 'slim_session',
'lifetime' => 24,
'path' => '/',
'domain' => null,
'secure' => false,
'httponly' => true,
// Set session cookie path, domain and secure automatically
'cookie_autoset' => true,
// Path where session files are stored, PHP's default path will be used if set null
'save_path' => null,
// Session cache limiter
'cache_limiter' => 'nocache',
// Extend session lifetime after each user activity
'autorefresh' => false,
// Encrypt session data if string is set
'encryption_key' => null,
// Session namespace
'namespace' => 'slim_app'
]
];
用法
应用程序
在创建应用程序时,注入所有设置
$app = new \Slim\App(['settings' => $settings]);
中间件
添加带有会话设置的中间件
$app->add(new \Adbar\SessionMiddleware($settings['session']));
会话
此包附带会话帮助类,但如果你只想使用 PHP 会话超全局变量,则可以跳过本指南的其余部分,尽情编码!会话安全配置在中间件内部完成,因此使用本地超全局变量,你的会话仍然是安全的(并且如果设置了加密密钥,则会加密)。
会话帮助类使用命名空间进行会话,所以基本上会话变量始终在一个数组中,数组的键是命名空间。如果你将键 'user' 的值 'John' 插入到命名空间 'users' 中,超全局 $_SESSION 看起来像这样
Array
(
[users] => Array
(
[user] => John
)
)
如果你不需要在应用程序中使用会话命名空间,则可以忽略本指南中与命名空间相关的内容,并在设置中将命名空间名称设置为 null(它将默认为命名空间 "slim_app")。
基本用法
你可以在应用程序容器中注入会话帮助类
$container['session'] = function ($container) {
return new \Adbar\Session(
$container->get('settings')['session']['namespace']
);
};
如果会话帮助类注入到应用程序容器中并且可以作为对象使用,即像这样
$app->get('/', function (Request $request, Response $response) {
// Namespace is now picked up from settings
$this->session->set('user', 'John');
})->setName('home);
或在你代码的任何地方
$session = new \Adbar\Session('my_namespace');
// Namespace is now 'my_namespace'
$session->set('user', 'John');
如果你不使用容器中的会话类,并且在创建会话对象时没有注入命名空间,则命名空间始终是 'slim_app'
$session = new \Adbar\Session;
// Namespace is now 'slim_app'
$session->set('user', 'John');
设置值
设置单个值
$session->set('user', 'John');
// Array style
$session['user'] = 'John';
// Magic method
$session->user = 'John';
// Set value to specific namespace
$session->setTo('my_namespace', 'user', 'John');
// Dot notation can be used with all methods except magic method:
$session->set('user.firstname', 'John');
$session['user.firstname'] = 'John';
$session->setTo('my_namespace', 'user.firstname', 'John');
一次性设置多个值
$user = ['firstname' => 'John', 'lastname' => 'Smith'];
$session->set($user);
// Or just simply
$session->set([
'firstname' => 'John',
'lastname' => 'Smith
]);
// Set values to specific namespace
$session->setTo('my_namespace', $user);
// Dot notation
$session->set([
'user.firstname' => 'John',
'user.lastname' => 'Smith'
]);
获取值
echo $session->get('user');
// Get default value if key doesn't exist
echo $session->get('user', 'some default user');
// Array style
echo $session['user'];
// Magic method
echo $session->user;
// From specific namespace
echo $session->getFrom('my_namespace', 'user');
// Dot notation
echo $session->get('user.firstname');
添加值
$session->add('users', 'Mary');
// Dot notation
$session->add('home.kids', 'Jerry');
一次性添加多个值
$session->add([
'users' => 'Sue',
'cars' => 'Toyota'
]);
// Dot notation
$session->add([
'users' => ['Katie', 'Ben'],
'home.kids' => ['Carl', 'Tom']
]);
检查值是否存在
if ($session->has('user')) {
// Do something...
}
// Array style
if (isset($session['user'])) {
// Do something...
}
// Magic method
if (isset($session->user)) {
// Do something...
}
// In specific namespace
if ($session->hasIn('my_namespace', 'user')) {
// Do something...
}
// Dot notation
if ($session->has('user.firstname')) {
// Do something...
}
删除值
$session->delete('user');
// Array style
unset($session['user']);
// Magic method
unset($session->user);
// From specific namespace
$session->deleteFrom('my_namespace', 'user');
// Dot notation
$session->delete('user.firstname');
一次性删除多个值
$session->delete(['user', 'home']);
// From specific namespace
$session->deleteFrom('my_namespace', ['user', 'home'']);
// Dot notation
$session->delete(['user', 'home.kids']);
清除值
清除所有值
$session->clear();
// From specific namespace
$session->clearFrom('my_namespace');
清除特定会话键内的所有值
$session->clear('user');
// From specific namespace
$session->clearFrom('my_namespace', 'user');
// Dot notation
$session->clear('home.kids');
一次性删除多个值
$session->clear(['user', 'home']);
// From specific namespace
$session->clearFrom('my_namespace', ['user', 'home']);
// Dot notation
$session->clear(['user', 'home.kids']);
完全销毁会话
$session->destroy();
// Static method
\Adbar\Session::destroy();
重新生成会话 ID
$session->regenerateId();
// Static method
\Adbar\Session::regenerateId();
更改命名空间
$session->setNamespace('another_namespace');
获取当前命名空间
$namespace = $session->getNamespace();
删除命名空间
$session->deleteNamespace('namespace_to_delete');