守门员模式 Gatekeeper Pattern

未匹配的标注

描述

    充当客户端和服务端之间的代理,验证和过滤的请求。这提供了一个额外的安全层,并限制了系统的攻击面。

背景和问题

    应用程序暴露终端给客户端连接,有可能会是受到恶意用户攻击,所以需要使用一些安全机制,诸如凭证和存储密钥。

解决方案

    为应用程序或服务增加守护层。该守护层应该拥有如下功能:
1. 控制验证。验证所有请求,并拒绝那些不符合验证的请求。
2. 有限的风险和曝光。守护层不具有访问所使用的凭证。如果守护层被攻破,攻击者无法获得这些访问凭据。
3. 适当的安全性。访问服务需要在完全信任模式下运行。如果守护层被破坏,就不能访问程序了。

注意事项

  1. 确保客户端连接守护层通过内部或保护端。客户端不应该暴露任何外部端点或接口。
  2. 关守必须在有限的特权模式下运行。
  3. 守护层的功能是纯粹的验证和过滤要求。
  4. 需要考虑守护和客户端之间的通讯,有些托管环境不支持HTTPS内部端点。
  5. 守护可能会对程序性能造成一定影响,因为需要额外的处理和网络通信。
  6. 守护可能发生单点故障,为了最大限度地减少故障的影响,考虑部署其他实例,并使用自动缩放机制。

何时使用

  1. 在分布式应用中,需要集中验证,以简化维护和管理。
  2. 处理敏感信息,保护资源免受恶意攻击。

结构中包含的角色

  1. Client 客户端
  2. Service 抽象服务
  3. ConcreteService 具体服务
  4. ProxyService 代理服务

可用到的设计模式思维

充当客户端和服务端之间的代理,这个守护层就是代理,使用代理模式处理。

最小可表达代码

// 抽象服务
interface Service
{
    public function request();
}

// 具体服务
class ConcreteService implements Service
{
    public function request()
    {
        var_dump('执行成功!');
    }
}

class ProxyService implements Service
{
    private $service;

    public function __construct()
    {  
        $this->service = new ConcreteService();
    }

    public function request() 
    {
        var_dump('安全校验中...');

        $this->service->request();
    }
}

class Client
{
    public function __construct(Service $service)
    {  
        $this->service = $service;
    }

    public function request()
    {
        $this->service->request();
    }

}

$client = new Client(new ProxyService);
$client->request();

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 0
发起讨论 只看当前版本


暂无话题~