第四十八章 为 Web 应用程序实现 HTTP 身份验证 - 在处理请求之前在 CSP 中进行身份验证
在处理请求之前在 CSP
中进行身份验证。
这是在 IRIS
中实现 HTTP
身份验证的替代方法。它主要适用于在 Web
应用程序中的请求处理时执行身份验证会很困难或耗时的情况。
在该方法中,通过调用专用的认证类来对用户进行认证。 Web
网关在将原始请求分派至 IRIS
之前执行此检查。当身份验证类成功检查用户的详细信息后,Web
应用程序无需执行任何进一步的检查。
当然,此方法需要承担每个 Web
请求处理两个请求(发送至 IRIS
)的开销:一个用于身份验证,另一个用于实际处理对 CSP
资源的请求。
实现此身份验证方法所需的基本参数显示在以下 Apache
配置块 (httpd.conf
) 中:
<Location "/csp/samples/">
AuthType Basic
AuthName "CSP samples"
require valid-user
AuthCSPEnable On
AuthCSPClass /csp/samples/%CSP.HTTPAuthentication.cls
AuthBasicAuthoritative Off
</Location>
参数AuthType
、AuthName
、require
和AuthCSPEnable
与方法(2
)相同。
附加的 AuthCSPClass
参数定义执行用户身份验证的类。该类必须继承 %CSP.Page
,并使用适当的 CGI
环境变量检查用户的登录详细信息,如果操作成功则返回 200 OK
响应标头,如果操作失败则返回 401 Authorization required
响应标头。
下面显示了一个简单的身份验证类,其中根据 %Users
文件中保存的记录检查用户登录详细信息:
Class %CSP.HTTPAuthentication Extends %CSP.Page
{
ClassMethod OnPreHTTP() As %Boolean
{
Set %response.ContentType = "text/html"
Set %session.Preserve = 0
Quit 1
}
ClassMethod OnPage() As %Status
{
Set crlf=$Char(13,10)
Set type=%request.GetCgiEnv("AUTH_TYPE", "")
Set user=%request.GetCgiEnv("REMOTE_USER", "")
Set pwd=%request.GetCgiEnv("AUTH_PASSWORD", "")
Set httpauth=%request.GetCgiEnv("HTTP_AUTHORIZATION", "")
If httpauth'="" {
Set type=$Piece(httpauth," ",1)
Set user=$system.Encryption.Base64Decode($Piece(httpauth," ",2))
Set pwd=$Piece(user,":",2)
Set user=$Piece(user,":",1)
}
Set auth=0
If $ZConvert(type,"L")'="basic" Set auth=1
If auth=0,user'="",$Get(^%Users(user))=pwd Set auth=1
If auth=1 {
Write "HTTP/1.1 200 OK"_crlf
Write "Content-Type: text/html"_crlf
Write "Content-Length: 0"_crlf
Write "Connection: close"_crlf_crlf
}
Else {
Write "HTTP/1.1 401 Authorization Required"_crlf
Write "WWW-Authenticate: Basic realm=""CSP samples"""_crlf
Write "Content-Type: text/html"_crlf
Write "Content-Length: 0"_crlf
Write "Connection: close"_crlf_crlf
}
Quit $$$OK
}
ClassMethod OnHTTPHeader(ByRef OutputBody As %Boolean) As %Status
{
Quit $$$OK
}
}
对于方法 (1) 和 (3),可以使用 Apache ErrorDocument
指令为登录失败指定自定义错误页面。例如:
ErrorDocument /error/my_authentication_error.html
当然,对于方法 (2),错误消息的文本由 Web
应用程序控制。