守门员模式 Gatekeeper Pattern
描述#
充当客户端和服务端之间的代理,验证和过滤的请求。这提供了一个额外的安全层,并限制了系统的攻击面。
背景和问题#
应用程序暴露终端给客户端连接,有可能会是受到恶意用户攻击,所以需要使用一些安全机制,诸如凭证和存储密钥。
解决方案#
为应用程序或服务增加守护层。该守护层应该拥有如下功能:
1. 控制验证。验证所有请求,并拒绝那些不符合验证的请求。
2. 有限的风险和曝光。守护层不具有访问所使用的凭证。如果守护层被攻破,攻击者无法获得这些访问凭据。
3. 适当的安全性。访问服务需要在完全信任模式下运行。如果守护层被破坏,就不能访问程序了。
注意事项#
- 确保客户端连接守护层通过内部或保护端。客户端不应该暴露任何外部端点或接口。
- 关守必须在有限的特权模式下运行。
- 守护层的功能是纯粹的验证和过滤要求。
- 需要考虑守护和客户端之间的通讯,有些托管环境不支持 HTTPS 内部端点。
- 守护可能会对程序性能造成一定影响,因为需要额外的处理和网络通信。
- 守护可能发生单点故障,为了最大限度地减少故障的影响,考虑部署其他实例,并使用自动缩放机制。
何时使用#
- 在分布式应用中,需要集中验证,以简化维护和管理。
- 处理敏感信息,保护资源免受恶意攻击。
结构中包含的角色#
- Client 客户端
- Service 抽象服务
- ConcreteService 具体服务
- 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();
推荐文章: