第四十八章 为 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 应用程序控制。

相关推荐
user205855615181339 分钟前
Windows 项目安装时报 `node-sass` 错误,如何快速处理
前端
LiaCode40 分钟前
Redis 在生产项目的使用
前端·后端
LiaCode1 小时前
一天学完 redis 的爽翻版核心知识总结
前端·后端
大刚测试开发实战1 小时前
如何内网穿透访问本地私有化部署的TestHub
前端·后端·github
风骏时光牛马1 小时前
# Ruby基于Rails框架实现多角色权限管理与数据分页查询完整实战代码案例
前端
weedsfly1 小时前
迭代器、生成器与异步迭代——让数据“按需流动”的艺术
前端·javascript
xiaodaoluanzha1 小时前
迄今為止,最簡單的編程語言 Nolang
前端·后端
Csvn1 小时前
Fetch 请求竞态终结者:AbortController 不只是用来"取消"的
前端
阡陌Jony1 小时前
关于前端路由中的参数问题的学习(一): params,query, hash(#)
前端
阡陌Jony1 小时前
缓存相关学习笔记(一):Service Worker 缓存
前端