mirror of
https://gitee.com/zoujingli/ThinkAdmin.git
synced 2025-06-18 18:59:15 +08:00
82 lines
2.8 KiB
PHP
82 lines
2.8 KiB
PHP
<?php
|
||
|
||
// +----------------------------------------------------------------------
|
||
// | ThinkAdmin
|
||
// +----------------------------------------------------------------------
|
||
// | 版权所有 2014~2020 广州楚才信息科技有限公司 [ http://www.cuci.cc ]
|
||
// +----------------------------------------------------------------------
|
||
// | 官方网站: https://gitee.com/zoujingli/ThinkLibrary
|
||
// +----------------------------------------------------------------------
|
||
// | 开源协议 ( https://mit-license.org )
|
||
// +----------------------------------------------------------------------
|
||
// | gitee 代码仓库:https://gitee.com/zoujingli/ThinkLibrary
|
||
// | github 代码仓库:https://github.com/zoujingli/ThinkLibrary
|
||
// +----------------------------------------------------------------------
|
||
|
||
namespace think\admin\service;
|
||
|
||
use think\admin\Service;
|
||
|
||
/**
|
||
* 表单令牌管理服务
|
||
* Class TokenService
|
||
* @package think\admin\service
|
||
*/
|
||
class TokenService extends Service
|
||
{
|
||
/**
|
||
* 获取当前请求令牌
|
||
* @return array|string
|
||
*/
|
||
public function getInputToken()
|
||
{
|
||
return $this->app->request->header('user-form-token', input('_csrf_', ''));
|
||
}
|
||
|
||
/**
|
||
* 验证表单令牌是否有效
|
||
* @param string $token 表单令牌
|
||
* @param string $node 授权节点
|
||
* @return boolean
|
||
*/
|
||
public function checkFormToken($token = null, $node = null)
|
||
{
|
||
if (is_null($token)) $token = $this->getInputToken();
|
||
if (is_null($node)) $node = NodeService::instance()->getCurrent();
|
||
// 读取缓存并检查是否有效
|
||
$cache = $this->app->session->get($token, []);
|
||
if (empty($cache['node']) || empty($cache['time']) || empty($cache['token'])) return false;
|
||
if ($cache['time'] + 600 < time() || strtolower($cache['node']) !== strtolower($node)) return false;
|
||
return true;
|
||
}
|
||
|
||
/**
|
||
* 清理表单CSRF信息
|
||
* @param string $token
|
||
* @return $this
|
||
*/
|
||
public function clearFormToken($token = null)
|
||
{
|
||
if (is_null($token)) $token = $this->getInputToken();
|
||
$this->app->session->delete($token);
|
||
return $this;
|
||
}
|
||
|
||
/**
|
||
* 生成表单CSRF信息
|
||
* @param null|string $node
|
||
* @return array
|
||
*/
|
||
public function buildFormToken($node = null)
|
||
{
|
||
list($token, $time) = [uniqid('csrf') . rand(1000, 9999), time()];
|
||
foreach ($this->app->session->all() as $key => $item) {
|
||
if (stripos($key, 'csrf') === 0 && isset($item['time'])) {
|
||
if ($item['time'] + 600 < $time) $this->clearFormToken($key);
|
||
}
|
||
}
|
||
$data = ['node' => NodeService::instance()->fullnode($node), 'token' => $token, 'time' => $time];
|
||
$this->app->session->set($token, $data);
|
||
return $data;
|
||
}
|
||
} |