在多租户架构的支持下,dify社区版已经具备了企业级智能体平台的基础功能。企业或个人用户只需对代码进行简单的定制化开发,即可基于Dify平台构建自己的多租户智能体平台。然而,在商业化应用中,需要特别注意Dify社区版的一些限制,建议提前规划并做出适当的调整。
企业级应用中的SSO(单点登录)
单点登录(SSO)是企业级平台中不可或缺的核心功能之一。通过SSO,企业用户可以在不同应用间实现无缝登录,避免重复认证,提高用户体验和安全性。在此功能的支持下,企业可以将智能体平台扩展到各种场景中,用户只需登录一次,即可访问其权限范围内的所有智能体应用。
不过,在Dify社区版中,SSO功能是默认禁用的,除非你知道如何开启它。
Dify的SSO逻辑设计
Dify的SSO系统基于企业级的功能需求设计,采用集中认证服务来实现用户的单点登录。通过这种方式,用户仅需登录一次即可访问多个关联的应用,极大地简化了认证流程。下面简要介绍Dify SSO的核心流程。
Dify SSO 核心流程
1.用户访问受保护资源
用户尝试访问集成到 Dify SSO 体系的应用(如应用 A),若未登录,应用 A 将用户重定向至 Dify 的中央认证服务(SSO 系统)。
2.身份验证
用户在 SSO 系统的登录页面输入凭据(如账号密码),Dify 验证通过后生成一个加密的 身份凭证(如 JWT 令牌或 Session Cookie)。
3.凭证传递与验证
方式一(Cookie):Dify 在用户浏览器设置一个 跨域安全 Cookie,后续访问其他应用时自动携带此 Cookie 完成验证。
方式二(Token):生成 JWT 令牌并通过 URL 参数或 HTTP Header 传递给应用,应用通过 Dify 的 API 验证令牌有效性。
4.多应用无缝访问
用户访问其他应用(如应用 B)时,应用 B 检测到未登录状态后重定向至 Dify SSO。由于浏览器已存在有效凭证,SSO 直接授权并重定向回应用 B,无需重复登录。
5.单点登出(SLO)
用户登出任意应用时,该应用通知 Dify SSO 清除全局会话,Dify 触发所有关联应用同步注销。
Dify SSO 的技术实现
协议支持:支持 OAuth 2.0、SAML 等标准协议,可集成企业 AD/LDAP 或第三方身份提供商(如 Okta、Azure AD)。
安全性:通过 HTTPS 加密通信,令牌采用签名验证防止篡改,支持短期令牌自动刷新。
企业级功能:在 Dify 企业版中,SSO 结合 RBAC(基于角色的访问控制),实现细粒度权限管理。
配置 Dify SSO 的关键步骤
1.启用 SSO 服务:在 Dify 社区版中配置 SSO 。
2.应用集成:为每个子应用分配唯一标识符,设置回调地址和权限范围。
3.会话管理:定义令牌有效期、单点登出策略及审计日志。
如何在Dify社区版中开启SSO功能
尽管Dify社区版默认不启用SSO功能,但你可以通过以下步骤开启并配置企业级的SSO服务:
开启企业配置
首先,你需要修改 EnterpriseFeatureConfig
配置文件,启用企业级功能。
class EnterpriseFeatureConfig(BaseSettings):
"""
Configuration for enterprise-level features.
**Before using, please contact business@dify.ai by email to inquire about licensing matters.**
"""
ENTERPRISE_ENABLED: bool = Field(
description="Enable or disable enterprise-level features."
"Before using, please contact business@dify.ai by email to inquire about licensing matters.",
default=False,
)
CAN_REPLACE_LOGO: bool = Field(
description="Allow customization of the enterprise logo.",
default=False,
)
企业的单点登录(SSO)配置信息
@classmethod
def _fulfill_params_from_enterprise(cls, features):
enterprise_info = EnterpriseService.get_info()
if "sso_enforced_for_signin" in enterprise_info:
features.sso_enforced_for_signin = enterprise_info["sso_enforced_for_signin"]
if "sso_enforced_for_signin_protocol" in enterprise_info:
features.sso_enforced_for_signin_protocol = enterprise_info["sso_enforced_for_signin_protocol"]
if "sso_enforced_for_web" in enterprise_info:
features.sso_enforced_for_web = enterprise_info["sso_enforced_for_web"]
if "sso_enforced_for_web_protocol" in enterprise_info:
features.sso_enforced_for_web_protocol = enterprise_info["sso_enforced_for_web_protocol"]
if "enable_email_code_login" in enterprise_info:
features.enable_email_code_login = enterprise_info["enable_email_code_login"]
if "enable_email_password_login" in enterprise_info:
features.enable_email_password_login = enterprise_info["enable_email_password_login"]
if "is_allow_register" in enterprise_info:
features.is_allow_register = enterprise_info["is_allow_register"]
if "is_allow_create_workspace" in enterprise_info:
features.is_allow_create_workspace = enterprise_info["is_allow_create_workspace"]
if "license" in enterprise_info:
license_info = enterprise_info["license"]
if "status" in license_info:
features.license.status = LicenseStatus(license_info.get("status", LicenseStatus.INACTIVE))
if "expired_at" in license_info:
features.license.expired_at = license_info["expired_at"]
-
检查
enterprise_info
中是否有键"sso_enforced_for_signin"
,如果有,将其值赋给features.sso_enforced_for_signin
。这表明是否启用强制单点登录(SSO)来进行用户登录 -
检查是否有键
"sso_enforced_for_signin_protocol"
,并将其值赋给features.sso_enforced_for_signin_protocol
。这表明是否使用特定的协议(如 OAuth、SAML 等)来进行登录。
-
检查
enterprise_info
中是否有键"sso_enforced_for_web"
,并将其值赋给features.sso_enforced_for_web
。这表示是否强制 Web 应用使用单点登录(SSO)。 -
检查是否有键
"sso_enforced_for_web_protocol"
,并将其值赋给features.sso_enforced_for_web_protocol
,表示 Web 应用使用的 SSO 协议。
from services.enterprise.base import EnterpriseRequest
class EnterpriseService:
@classmethod
def get_info(cls):
return EnterpriseRequest.send_request("GET", "/info")
@classmethod
def get_app_web_sso_enabled(cls, app_code):
return EnterpriseRequest.send_request("GET", f"/app-sso-setting?appCode={app_code}")

写在最后
Dify的多租户架构为企业级智能体平台的构建提供了强大的支持,而SSO(单点登录)功能则是这一架构中不可或缺的关键一环。企业在打造自己的智能体平台时,必须重视并配置SSO相关功能,以确保用户能够以单一身份登录,方便地在不同应用间无缝切换。特别是对于面向企业用户的商业版本,启用SSO不仅是提升用户体验的必要条件,也是确保企业级平台安全性和易用性的重要措施。