Access 自定义页面允许你自定义访客登录、收到 Access 策略拒绝或批准命令行登录时看到的页面。模板使用 HTML 和 Liquid 显示特定于请求的信息。
自定义页面只会更改显示方式,不会更改 Access 决策。它们不会授予访问权限,也不能取代身份验证和授权策略。
为每种页面类型创建单独的模板:
| 类型 | 用途 | 必需控件 |
|---|---|---|
| 登录 | 登录 Access 应用。 | 恰好一个 <cf-access-authbox></cf-access-authbox> 元素。 |
| 身份被拒绝 | 说明访客登录后被拒绝的原因。身份验证成功并不保证策略授权。 | 无需交互式控件。 |
| 禁止访问 | 说明非身份策略拒绝,例如请求未通过服务身份验证策略。 | 无需交互式控件。 |
| 插页 | 要求访客批准或拒绝命令行登录请求。 | 恰好一个 <cf-access-cli-approval></cf-access-cli-approval> 元素。 |
Access 会将自己的登录和批准控件插入必需元素中。请让这些元素保持可见,并置于 Liquid 条件或循环之外。它们必须恰好渲染一次,而不只是出现在模板源代码中一次。不要使用自己的表单、身份提供商链接或批准按钮替换它们。
-
在 Cloudflare One 中,转到 Reusable components > Custom pages。
前往 ↗ -
在 Access custom pages 卡片上,选择 Manage。
-
选择 Create custom page。
-
输入唯一的 Name 并选择 Type。编辑器会加载该类型的起始模板。
-
编辑 HTML 和 Liquid。对于登录或插页页面,请保留必需控件。
-
使用 Variables 查看所选类型可用的数据。检查 Problems 中的验证错误和警告。
-
解决阻止性错误,然后选择 Publish。如果验证不可用,请在发布前选择 Retry validation。
发布会保存一个可复用模板。要显示该模板,请将其分配给应用或设为账户默认模板。
这个最小示例会显示应用名称、登录消息和 Access 登录控件:
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Sign in to {{ app_name }}</title>
</head>
<body>
<main>
<h1>Sign in to {{ app_name }}</h1>
{% if message.text.size > 0 %}
<p role="status">{{ message.text }}</p>
{% endif %}
<cf-access-authbox></cf-access-authbox>
</main>
</body>
</html>让 message.text 保持可见,以便访客了解登录问题。不要在模板中硬编码身份提供商 URL,也不要将凭据复制到模板中。
对于自托管应用:
-
转到 Access controls > Applications,然后选择应用。
前往 Applications(应用程序) ↗ -
打开 Additional settings 并找到 Custom block pages。此部分还包含登录和插页设置。
-
为要替换的页面选择相应选项:
应用设置 选项 模板类型 身份失败阻止页面 自定义页面模板 身份被拒绝 非身份失败阻止页面 自定义页面模板 禁止访问 登录页面 自定义页面 登录 插页页面 自定义页面 插页 -
从下拉列表中选择已保存的模板。每个下拉列表只提供匹配的页面类型。
-
选择 Save,然后执行应用流程。重新测试前,请预留配置更改传播的时间。
要移除应用分配,请为该页面类型选择 Cloudflare default 并保存。如果存在账户默认模板,且没有应用专用模板,Access 会使用账户默认模板。
Access custom pages 列表提供 Set as default 和 Remove as default 操作。对于同一类型,应用专用分配优先于账户默认设置。如果两者都未分配,Access 会使用其内置页面。
账户默认设置会影响继承该页面类型的应用。更改账户默认设置前,请先测试应用专用分配。
在编辑器中选择 Variables,可查看所选类型的变量名称和说明。不要假设每种页面类型都具有相同的数据。
| 页面类型 | 可用数据示例 |
|---|---|
| 登录 | app_name、app_domain、org、idps、has_onetimepin 和 message。idps 列表提供显示信息,而不是登录 URL。 |
| 身份被拒绝 和 禁止访问 | app,以及可选的 ray_id、user 和 policy_evaluation 数据。登录前可能没有用户信息。 |
| 插页 | app、requesting_tool 和可选的 user 数据。批准凭据属于 Access 控件,而不是模板数据。 |
| 所有类型 | request 连接信息和可选的 locale。请求字段也可能不存在。 |
使用 Liquid 条件保护可选数据。例如,身份被拒绝页面可以在电子邮件地址可用时显示它:
<h1>Access denied</h1>
<p>You do not have access to {{ app.name }}.</p>
{% if user.email %}
<p>You are signed in as {{ user.email }}.</p>
{% endif %} {% if ray_id %}
<p>Share this Ray ID with your administrator: {{ ray_id }}</p>
{% endif %}Liquid 输出会进行 HTML 转义。缺失的变量会渲染为空文本。策略评估数据是结构化信息,并不是现成的拒绝说明。请选择要显示的内容,避免不必要地暴露敏感群组名称、声明或策略详细信息。
模板在受限的 Liquid 环境中运行:
- 不支持客户 JavaScript、内联事件处理程序和自定义身份验证表单。Access 拥有交互式登录和批准控件。
- Liquid 标签
include、render、layout、echo和raw,以及raw过滤器不可用。 - HTML 和 CSS 会经过清理。外部资源必须符合页面的内容安全策略 (CSP)。请使用 HTTPS 图像和字体 URL,不要依赖第三方脚本渲染页面。
- 解析、渲染和内存限制均适用。请保持模板简小,并避免高开销循环。
如果已保存的模板不可用或无法安全渲染,Access 会回退到内置页面。此回退不会更改策略决策。
从 Access custom pages 中选择模板进行编辑。模板创建后其类型固定不变。检查 Problems,然后选择 Publish 保存更改。
一个模板可供多个应用使用。发布编辑会更改共享模板,因此需要避免影响现有分配时,请使用单独的模板进行测试。删除模板前,请替换其应用分配,并取消其账户默认设置。
在仪表板之外保留 HTML 和 Liquid 的副本。编辑器不提供渲染预览或 Download 操作。