如何在AWS Amplify应用中仅限制单个子页面的访问权限?
针对AWS Amplify路径级访问限制的实现方案
要在AWS Amplify托管的站点中仅限制website.com/subpage路径的访问,同时开放其余页面,可以通过以下几种方案实现:
方案1:Amplify重写规则 + 自定义Lambda认证函数
这是最贴合Amplify生态的方案,无需额外依赖CloudFront配置:
创建认证Lambda函数
在Amplify控制台中添加一个Lambda函数(类型选"API"或"自定义"),编写逻辑验证请求的合法性:- 检查请求头中的
Authorization凭证(比如基本认证、API密钥) - 若凭证有效,返回原
/subpage路径的内容;若无效,返回401 Unauthorized状态码
- 检查请求头中的
配置重写规则
进入Amplify控制台的"重写和重定向"页面,添加规则:- 源地址:
^/subpage/(.*)$ - 目标地址:
/your-lambda-endpoint/$1(替换为你的Lambda函数访问地址) - 类型:
200 (Rewrite)
这条规则会将所有/subpage下的请求转发到Lambda函数进行认证,验证通过后返回页面内容。
- 源地址:
方案2:Lambda@Edge + CloudFront(适合复杂场景)
由于Amplify默认通过CloudFront分发内容,可以利用Lambda@Edge在请求到达前进行路径级校验:
创建Lambda@Edge函数
在us-east-1区域创建Lambda函数,编写Viewer Request阶段的处理逻辑:exports.handler = async (event) => { const request = event.Records[0].cf.request; const uri = request.uri; // 匹配/subpage路径 if (uri.startsWith('/subpage/') || uri === '/subpage') { const authHeader = request.headers.authorization; // 这里添加你的认证逻辑,比如验证基本认证凭证 if (!authHeader || !validateCredentials(authHeader)) { return { status: '401', statusDescription: 'Unauthorized', headers: { 'www-authenticate': [{ key: 'WWW-Authenticate', value: 'Basic realm="Restricted Area"' }] } }; } } // 非受限路径直接放行 return request; }; function validateCredentials(authHeader) { // 实现你的凭证验证逻辑,比如对比预设的用户名密码 const encoded = authHeader.split(' ')[1]; const [user, pass] = Buffer.from(encoded, 'base64').toString().split(':'); return user === 'your-user' && pass === 'your-pass'; }关联到CloudFront分发
找到Amplify对应的CloudFront分发,在"行为"中编辑默认行为,将上述Lambda@Edge函数关联到"Viewer Request"事件。
方案3:简单基本认证(适合快速场景)
如果只需要简单的密码保护,可通过自定义HTTP头配合前端认证提示:
在项目根目录的amplify.yml中添加headers配置,仅对/subpage路径返回认证提示头:
version: 1 frontend: phases: build: commands: - # 你的构建命令 artifacts: baseDirectory: dist files: - '**/*' cache: paths: - node_modules/**/* headers: - pattern: /subpage/** headers: - key: WWW-Authenticate value: Basic realm="Restricted Subpage"
然后配合方案1的Lambda函数来验证用户输入的凭证,确保只有合法用户能访问该路径。
内容的提问来源于stack exchange,提问作者darthV
相关产品推荐
相关产品推荐

