Indy HTTP Server (TIdHTTPServer) 支持HTTP 基本身份验证,其中包含 Request 对象的属性 AuthExists、AuthUser 和 AuthPass 以及 Response.AuthRealm 属性。(我还没有检查是否也支持 NTLM 或 Digest auth)。
通过在响应中设置 AuthRealm 属性,将通知客户端需要基本身份验证。如果客户端在请求中发送用户名和密码,服务器可以在命令处理程序中检查它。
所以实际上 Indy 为保护资源提供了内置支持——这适用于普通浏览器和 REST 客户端,如果请求包含 auth 标头,两者都只能访问服务器资源。
我也在基于 Indy 的(商业)Web 框架中实现了它。示例代码保护服务器上的所有内容,并具有硬编码的用户名/密码组合。
procedure TBasicAuthHandlerWrapper.Handle(Target: string; Context:
TdjServerContext;
Request: TIdHTTPRequestInfo; Response: TIdHTTPResponseInfo);
const
AUTH_USER = 'sherlock';
AUTH_PASS = 'holmes';
begin
if Request.AuthExists and ((Request.AuthUsername = AUTH_USER) and
(Request.AuthPassword = AUTH_PASS)) then
begin
// pass
inherited;
end
else
begin
// show login dialog
Response.AuthRealm := 'Welcome to Web Components Server!';
end;
end;
注意:此示例保护所有资源独立于扩展名和路径。但这很容易通过检查 Request.Document 中可用路径的条件添加到方法主体中。