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

相关推荐
佛系打工仔2 小时前
绘制K线第二章:背景网格绘制
android·前端·架构
明天好,会的4 小时前
分形生成实验(五):人机协同破局--30万token揭示Actix-web状态管理的微妙边界
运维·服务器·前端
C_心欲无痕4 小时前
nginx - alias 和 root 的区别详解
运维·前端·nginx
我是苏苏6 小时前
Web开发:C#通过ProcessStartInfo动态调用执行Python脚本
java·服务器·前端
无羡仙7 小时前
Vue插槽
前端·vue.js
用户6387994773058 小时前
每组件(Per-Component)与集中式(Centralized)i18n
前端·javascript
SsunmdayKT8 小时前
React + Ts eslint配置
前端
开始学java8 小时前
useEffect 空依赖 + 定时器 = 闭包陷阱?count 永远停在 1 的坑我踩透了
前端
zerosrat8 小时前
从零实现 React Native(2): 跨平台支持
前端·react native