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())

用户认证流程

  1. 用户访问受保护应用
  2. 重定向到Authentik登录页面
  3. 完成认证(用户名/密码、MFA等)
  4. 返回应用并授予访问权限

核心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智能小助手)
公众号二维码

posted @ 2025-08-01 16:18  qife  阅读(13)  评论(0)    收藏  举报