adbario/slim-secure-session-middleware

Slim 3 框架的安全会话中间件

1.3.4 2017-08-04 13:51 UTC

This package is auto-updated.

Last update: 2024-09-11 13:47:40 UTC


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');