项目标题与描述
Authelia是一个开源的认证和授权服务器,专注于为应用程序提供双因素认证(2FA)和单点登录(SSO)功能。通过Web门户,Authelia能够作为身份和访问管理(IAM)系统,确保应用程序的安全性。项目支持OpenID Connect 1.0协议,并已通过OpenID认证,具备广泛的集成能力。
功能特性
- 双因素认证:支持TOTP、WebAuthn等多种双因素认证方式,提升账户安全性。
- 单点登录:提供统一的登录门户,简化用户访问多个应用的流程。
- OpenID Connect提供者:作为认证提供者,支持与第三方应用集成。
- 灵活的访问控制:基于规则策略,支持按域名、资源、网络等条件进行细粒度授权。
- 多后端支持:支持LDAP、文件等多种用户存储后端,适应不同环境需求。
- 高度可配置:通过YAML配置文件,可自定义认证策略、密码策略等。
安装指南
系统要求
- Linux/FreeBSD系统(macOS目前不支持开发工作流)
- Go 1.18+
- Node.js和pnpm(用于前端构建)
- Docker和Docker Compose(用于容器化部署)
安装步骤
-
克隆项目仓库:
bashgit clone https://github.com/authelia/authelia.git cd authelia -
运行引导脚本以安装依赖:
bash./bootstrap.sh -
构建项目:
bashauthelia-scripts build -
使用Docker构建镜像:
bashauthelia-scripts docker build
依赖项
- 后端:Go模块依赖(详见
go.mod) - 前端:Node.js和pnpm(依赖项在
web/package.json中定义)
使用说明
基本配置
Authelia通过YAML文件进行配置。以下是一个最小配置示例:
yaml
server:
host: 0.0.0.0
port: 9091
authentication_backend:
file:
path: /config/users_database.yml
access_control:
default_policy: deny
rules:
- domain: "secure.example.com"
policy: two_factor
启动服务
使用以下命令启动Authelia服务:
bash
authelia --config /path/to/configuration.yml
API使用
Authelia提供RESTful API用于集成。例如,检查用户权限:
bash
curl -X POST https://auth.example.com/api/verify \
-H "Content-Type: application/json" \
-d '{"username": "user", "password": "pass"}'
核心代码
主入口点
主函数初始化并执行根命令:
go
package main
import (
"os"
"github.com/authelia/authelia/v4/internal/commands"
)
func main() {
if err := commands.NewRootCmd().Execute(); err != nil {
os.Exit(1)
}
}
认证提供者接口
定义用户提供者的核心接口:
go
package authentication
type UserProvider interface {
CheckUserPassword(username string, password string) (valid bool, err error)
GetDetails(username string) (details *UserDetails, err error)
UpdatePassword(username string, newPassword string) (err error)
Close() (err error)
}
访问控制规则
实现基于规则的访问控制逻辑:
go
package authorization
type AccessControlRule struct {
Domains []AccessControlDomain
Resources []AccessControlResource
Policy Level
}
func (acr *AccessControlRule) IsMatch(subject Subject, object Object) (match bool) {
if !acr.MatchesDomains(subject, object) {
return false
}
// 其他匹配逻辑...
return true
}