Authelia 是开源无状态反向代理鉴权网关,不托管凭证或会话,通过 JWT/OIDC 与上游 IDP 联动认证,并在代理层注入 X-Forwarded-User 等头供后端消费;Golang 服务需校验请求来源、安全解析透传头,并基于其做 RBAC 授权而非重复认证。

Authelia 是一个开源的无状态反向代理鉴权网关,它不托管用户凭证,也不维护会话状态,而是通过 JWT 或 OIDC 协议与上游 Identity Provider(如 Keycloak、GitHub、LDAP)联动完成认证,并在反向代理层注入标准化的头(如 X-Forwarded-User、X-Forwarded-Groups)供后端微服务消费。Golang 微服务本身不直接集成 Authelia,而是作为被保护的上游服务,被动接收其透传的认证上下文。
你真正要做的,是让 Golang 服务能安全、可靠地信任并解析 Authelia 注入的头信息——这比“引入 Authelia”更关键,也更容易踩坑。
Authelia 代理配置必须显式开启 header 透传
Authelia 默认不会自动注入用户身份头;你必须在 configuration.yml 中明确启用并配置:
- access_control 规则里设置 policy: one_factor 或 two_factor 后,还需确保匹配规则的请求路径触发了认证流程;
- identity_providers 下的 OIDC/LDAP 配置必须成功返回 user 和 groups 字段;
- 关键:在 server → headers 区块中启用:
headers: forwarded_user: true forwarded_groups: true forwarded_email: true
否则你的 Golang 服务收不到任何有效头,
X-Forwarded-User 永远为空。
Golang 服务必须校验请求来源是否来自 Authelia
Authelia 只是反向代理,不加密也不签名头字段。如果攻击者绕过 Authelia 直连你的 Golang 服务,就能伪造 X-Forwarded-User 实现越权。
所以你不能只信这个头,而要确认请求确实经过 Authelia:
- 在 Golang HTTP handler 中检查 req.RemoteAddr 是否属于 Authelia 所在节点的 IP 段(如 10.0.1.0/24),或更稳妥地:
- 要求 Authelia 在转发时添加一个私有签名头(如 X-Authelia-Sig),并在 Golang 中用共享密钥验证其 HMAC 值;
- 或者,强制所有流量走 mTLS,让 Golang 服务只接受来自 Authelia 客户端证书的连接(req.TLS != nil && len(req.TLS.PeerCertificates) > 0);
- 切忌只做 if header == "" { reject } —— 这等于没鉴权。
解析 X-Forwarded-* 头时注意空格、重复和注入风险
Authelia 默认用逗号分隔 X-Forwarded-Groups,但标准未规定格式,不同部署可能用分号或换行;Golang 代码需健壮处理:
- 使用 strings.TrimSpace 清理每个 group 名称;
- 对 X-Forwarded-User 做正则校验(如 ^[a-z0-9]([a-z0-9.-]*[a-z0-9])?$),拒绝含控制字符、空格、@ 符号的值;
- 不要直接拼接进 SQL 或 shell 命令;
- 示例校验逻辑:
user := strings.TrimSpace(r.Header.Get("X-Forwarded-User"))
if user == "" || !validUsernameRegex.MatchString(user) {
http.Error(w, "unauthorized", http.StatusUnauthorized)
return
}
RBAC 权限判断应基于透传头,而非重新解析 JWT
Authelia 已完成认证(OIDC/JWT 校验、MFA、session 管理),你的 Golang 服务只需做授权(Authorization),即“这个已知用户能否访问这个资源”。
- 不要在 Golang 中重复调用 Keycloak 或解析 ID Token —— 这既冗余又易出错(比如公钥过期、aud 不匹配);
- 推荐做法:把 X-Forwarded-User + X-Forwarded-Groups 当作可信输入,查本地缓存或策略引擎(如 Casbin)做 RBAC 决策;
- 若需细粒度权限(如 “用户 A 能编辑文档 D”),建议将 X-Forwarded-User 传给独立的策略服务,Golang 仅做透传和决策结果消费;
- 注意:X-Forwarded-Groups 是字符串列表,不是 JSON 数组,解析时别用 json.Unmarshal,改用 strings.Split 并去重。
Authelia 的价值在于统一认证入口和无状态会话管理,但它不解决“下游服务如何安全消费这些信息”的问题。最容易被忽略的点是:没有网络层防护(IP 白名单/mTLS)的 X-Forwarded-User 头,和明文 HTTP 请求头一样脆弱。别让它裸奔。


















