chore(deprecated): 声明弃用了 SessionMiddleware

Signed-off-by: 李东云 <dongyu.li@luxcreo.ai>
This commit is contained in:
李东云
2023-07-05 16:40:38 +08:00
parent 8616c5f61c
commit 2b0374bcc8

View File

@@ -15,8 +15,11 @@ use Hyperf\Contract\SessionInterface;
use Hyperf\HttpMessage\Cookie\Cookie; use Hyperf\HttpMessage\Cookie\Cookie;
use Hyperf\HttpMessage\Server\Response; use Hyperf\HttpMessage\Server\Response;
use Hyperf\Session\SessionManager; use Hyperf\Session\SessionManager;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\MiddlewareInterface;
use Psr\Http\Server\RequestHandlerInterface;
/** /**
* Singularity\HDK\Core\Middleware\SessionMiddleware@HDK-Core * Singularity\HDK\Core\Middleware\SessionMiddleware@HDK-Core
@@ -24,12 +27,70 @@ use Psr\Http\Message\ServerRequestInterface;
* @author 李东云 <Dongyun.Li@LuxCreo.Ai> * @author 李东云 <Dongyun.Li@LuxCreo.Ai>
* Powered by PhpStorm * Powered by PhpStorm
* Created on 2023/3/8 * Created on 2023/3/8
*
* @deprecated since 0.2.21, use \Singularity\HDK\Auth\Middleware\SessionMiddleware instead.
*/ */
class SessionMiddleware extends \Hyperf\Session\Middleware\SessionMiddleware class SessionMiddleware implements MiddlewareInterface
{ {
public function __construct(private SessionManager $sessionManager, private ConfigInterface $config) public function __construct(private SessionManager $sessionManager, private ConfigInterface $config)
{ {
parent::__construct($this->sessionManager, $this->config); }
/**
* Process an incoming server request.
* Processes an incoming server request in order to produce a response.
* If unable to produce the response itself, it may delegate to the provided
* request handler to do so.
*/
public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
{
if (!$this->isSessionAvailable()) {
return $handler->handle($request);
}
$session = $this->sessionManager->start($request);
try {
$response = $handler->handle($request);
} finally {
$this->storeCurrentUrl($request, $session);
$session = $this->sessionManager->getSession();
/*
* 现在的机制,但凡写入 Redis 的数据,
* 过期时间就是固定的 gc_maxlifetime
*
* 而 RedisHandler 只会被依赖注入时加载一次,
* 后续无法临时修改 gc_maxlifetime
*
* 又因为现在没有其他情况用到 session
* 只有登录之后才会记下用户信息
*
* 所以一个妥协的方案,就是只有登录了再写入 Redis
*
* (除非重写整套 RedisHandler/RedisHandlerFactory/...
*/
if (!$this->auth($session)) {
$this->sessionManager->end($session);
}
}
return $this->addCookieToResponse($request, $response, $session);
}
private function isSessionAvailable(): bool
{
return $this->config->has('session.handler');
}
/**
* Store the current URL for the request if necessary.
*/
private function storeCurrentUrl(RequestInterface $request, SessionInterface $session)
{
if ($request->getMethod() === 'GET') {
$session->setPreviousUrl($this->fullUrl($request));
}
} }
/** /**
@@ -43,10 +104,13 @@ class SessionMiddleware extends \Hyperf\Session\Middleware\SessionMiddleware
$cookie = new Cookie( $cookie = new Cookie(
name: $session->getName(), name: $session->getName(),
value: $session->getId(), value: $session->getId(),
expire: $this->getCookieExpirationDate(), expire: $this->getCookieExpirationDate($session),
path: $this->config->get('session.options.path', '/'), path: $this->config->get('session.options.path', '/'),
domain: $this->config->get('session.options.domain', $request->getUri()->getHost()), domain: $this->config->get('session.options.domain', $request->getUri()->getHost()),
secure: $this->config->get('session.options.secure', strtolower($request->getUri()->getScheme()) === 'https'), secure: $this->config->get(
'session.options.secure',
strtolower($request->getUri()->getScheme()) === 'https'
),
httpOnly: true, httpOnly: true,
sameSite: $this->config->get('session.options.samesite', Cookie::SAMESITE_LAX) sameSite: $this->config->get('session.options.samesite', Cookie::SAMESITE_LAX)
); );
@@ -57,12 +121,24 @@ class SessionMiddleware extends \Hyperf\Session\Middleware\SessionMiddleware
return $response->withCookie($cookie); return $response->withCookie($cookie);
} }
/**
* Get the full URL for the request.
*/
private function fullUrl(RequestInterface $request): string
{
$uri = $request->getUri();
$query = $uri->getQuery();
$question = $uri->getHost() . $uri->getPath() == '/' ? '/?' : '?';
return $query ? $this->url($request) . $question . $query : $this->url($request);
}
/** /**
* Get the session lifetime in seconds. * Get the session lifetime in seconds.
*/ */
private function getCookieExpirationDate(): int private function getCookieExpirationDate(SessionInterface $session): int
{ {
if ($this->config->get('session.options.expire_on_close')) { // if ($this->config->get('session.options.expire_on_close')) {
if (!$this->auth($session)) {
$expirationDate = 0; $expirationDate = 0;
} else { } else {
$expireSeconds = $this->config->get('session.options.cookie_lifetime', 5 * 60 * 60); $expireSeconds = $this->config->get('session.options.cookie_lifetime', 5 * 60 * 60);
@@ -70,4 +146,17 @@ class SessionMiddleware extends \Hyperf\Session\Middleware\SessionMiddleware
} }
return $expirationDate; return $expirationDate;
} }
/**
* Get the URL (no query string) for the request.
*/
private function url(RequestInterface $request): string
{
return rtrim(preg_replace('/\?.*/', '', (string)$request->getUri()));
}
private function auth(SessionInterface $session)
{
return $session->has('userInfo');
}
} }