守门员模式 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 网站上。

上一篇 下一篇
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 0
发起讨论 查看所有版本


暂无话题~