Authentik:开源身份认证与访问管理平台
项目标题与描述
Authentik是一个开源的灵活身份提供商(Identity Provider),强调多功能性和可扩展性,支持广泛的认证协议。该项目可作为自托管的身份认证解决方案,替代商业产品如Okta、Auth0、Microsoft Entra ID等。
核心功能包括:
- 多协议支持
- 用户生命周期管理
- 认证流程定制
- 权限与访问控制
- 多租户支持
功能特性
- 多协议认证:支持OAuth2、SAML等多种认证协议
- 可视化流程设计:通过图形界面设计认证流程
- 用户自助服务:提供密码重置、账户恢复等功能
- 细粒度权限控制:基于RBAC的权限管理系统
- 审计日志:记录所有关键操作事件
- 多租户支持:可为不同客户提供独立实例
- 蓝本系统:通过YAML文件定义和部署配置
- Webfinger发现:支持Webfinger协议的服务发现
安装指南
快速开始(Docker Compose)
推荐使用Docker Compose进行小型/测试部署:
wget https://goauthentik.io/docker-compose.yml
docker-compose up -d
Kubernetes部署
对于生产环境,可使用Helm Chart:
helm repo add authentik https://charts.goauthentik.io
helm install authentik authentik/authentik
系统要求
- Docker 20.10+
- PostgreSQL 12+
- Redis 6+
- 2GB+内存
使用说明
基本API调用示例
获取当前系统信息:
import requests
response = requests.get("https://auth.example.com/api/v3/root/config/")
print(response.json())
用户认证流程
- 用户访问受保护应用
- 重定向到Authentik登录页面
- 完成认证(用户名/密码、MFA等)
- 返回应用并授予访问权限
核心API端点
/api/v3/core/users/
- 用户管理/api/v3/core/groups/
- 用户组管理/api/v3/providers/
- 认证提供商配置/api/v3/policy/
- 访问策略管理
核心代码
用户模型(简化版)
class User(AbstractUser, GuardianUserMixin):
"""Custom User model with additional fields"""
uuid = models.UUIDField(default=uuid4, primary_key=True)
attributes = models.JSONField(default=dict)
type = models.TextField(choices=UserTypes.choices, default=UserTypes.INTERNAL)
@property
def serializer(self) -> Serializer:
from authentik.core.api.users import UserSerializer
return UserSerializer
def __str__(self):
return self.username
认证中间件
class AuthenticationMiddleware(MiddlewareMixin):
"""Middleware to authenticate users via session"""
def process_request(self, request):
if not hasattr(request, "session"):
raise ImproperlyConfigured("Session middleware required")
request.user = SimpleLazyObject(lambda: get_user(request))
request.auser = partial(aget_user, request)
蓝本导入器
class Importer:
"""Import and apply blueprints"""
def apply(self):
"""Apply all entries in blueprint"""
for entry in self.blueprint.entries:
try:
model = apps.get_model(entry.model)
obj, created = model.objects.update_or_create(
**entry.identifiers,
defaults=entry.attrs
)
if created:
LOGGER.debug("Created object", model=entry.model)
except Exception as exc:
raise EntryInvalidError from exc
更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)
公众号二维码