第四十八章 为 Web 应用程序实现 HTTP 身份验证 - 在处理请求之前在 CSP 中进行身份验证

文章目录

  • [第四十八章 为 Web 应用程序实现 HTTP 身份验证 - 在处理请求之前在 CSP 中进行身份验证](#第四十八章 为 Web 应用程序实现 HTTP 身份验证 - 在处理请求之前在 CSP 中进行身份验证)
  • [在处理请求之前在 `CSP` 中进行身份验证。](#在处理请求之前在 CSP 中进行身份验证。)

第四十八章 为 Web 应用程序实现 HTTP 身份验证 - 在处理请求之前在 CSP 中进行身份验证

在处理请求之前在 CSP 中进行身份验证。

这是在 IRIS 中实现 HTTP 身份验证的替代方法。它主要适用于在 Web 应用程序中的请求处理时执行身份验证会很困难或耗时的情况。

在该方法中,通过调用专用的认证类来对用户进行认证。 Web 网关在将原始请求分派至 IRIS 之前执行此检查。当身份验证类成功检查用户的详细信息后,Web 应用程序无需执行任何进一步的检查。

当然,此方法需要承担每个 Web 请求处理两个请求(发送至 IRIS)的开销:一个用于身份验证,另一个用于实际处理对 CSP 资源的请求。

实现此身份验证方法所需的基本参数显示在以下 Apache 配置块 (httpd.conf) 中:

xml 复制代码
<Location "/csp/samples/"> 
    AuthType Basic 
    AuthName "CSP samples" 
    require valid-user 
    AuthCSPEnable On 
    AuthCSPClass /csp/samples/%CSP.HTTPAuthentication.cls 
    AuthBasicAuthoritative Off
</Location> 

参数AuthTypeAuthNamerequireAuthCSPEnable与方法(2)相同。

附加的 AuthCSPClass 参数定义执行用户身份验证的类。该类必须继承 %CSP.Page,并使用适当的 CGI 环境变量检查用户的登录详细信息,如果操作成功则返回 200 OK 响应标头,如果操作失败则返回 401 Authorization required 响应标头。

下面显示了一个简单的身份验证类,其中根据 %Users 文件中保存的记录检查用户登录详细信息:

java 复制代码
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 指令为登录失败指定自定义错误页面。例如:

java 复制代码
ErrorDocument /error/my_authentication_error.html 

当然,对于方法 (2),错误消息的文本由 Web 应用程序控制。

相关推荐
Csvn6 小时前
OpenSpec 详细使用教程
前端
之歆7 小时前
Day19_LESS 完全指南——从入门到工程实践
前端·css·less
云水一下8 小时前
HTML5 从入门到精通:实战收官——从零搭建完整静态网站,综合运用所有知识
前端·html5
不总是8 小时前
Windows 系统 Node.js 免安装版(zip)安装与配置教程(2026 最新)
前端·windows·node.js
冬奇Lab8 小时前
每日一个开源项目(第105篇):Twenty - 跳出 Salesforce 的圈套,定义现代开源 CRM
前端·后端·开源
zhangyao9403309 小时前
开发pc端时,表格的高度怎么设置才能铺满页面
前端·javascript·elementui
kjs--9 小时前
浏览器书签执行脚本
前端
之歆10 小时前
Day16_JavaScript 轮播图与事件工程实战(下篇)
服务器·开发语言·前端·javascript·网络·性能优化
沄媪10 小时前
CSRF 跨站请求伪造
前端·ctf·csrf
kyriewen10 小时前
我关掉了Copilot:因为我写的代码出现在了别人的建议里
前端·javascript·ai编程