简介

随着环境中搭建的应用越来越多(seafile 云盘、seatable 在线表格、immich 图片管理、confluence 知识库、outline 在线文档等),每个应用都配置对应的用户名和密码,应用多了使用和记录以及日常的管理都非常麻烦,有没有一种应用能够将这些账号整合起来统一管理呢?这就是需要实现的单点登录。

目标

  1. 配置并启用 keycloak
  2. 在 keycloak 中配置应用和对应的账号
  3. 配置 seafile 云盘应用使用 keycloak 的账号实现 sso 单点登录

Seafile 的功能和安装无需过多介绍,详细的内容可以参考以下文档:

seatable 用来提供在线表格应用,详细的配置过程可以参考以下内容:

Keycloak 提供针对现代应用程序和服务的开源身份和访问管理解决方案,支持单点登录 SSO,服务可通过 OpenID Connect、OAuth 2.0 等协议对接 Keycloak。有关 Keycloak 内容可以参考以下文档:

身份认证与授权简述

名词英文说明
身份识别 Identification    让系统知道你是谁
身份验证   Authentication    让系统相信你是谁
授权Authorization    允许他人存取某项资源
访问控制 Access Control    检验是否有资格存取某项资源
  • 身份识别 (Identification) 要让系统知道你是谁,就必须告诉他。在我们一开使「输入账号」的时候,其实就是在做这件事情。
  • 身份验证。这个部分也就是主要确定「你」是谁的活动。为了达成这个目的,需要知道除了系统外,只有你才知道的信息(或只有你才拥有的)。 最常见的辨识方式就是「密码」,此外,近来的生物识别,包含指纹辨识、Face Id、虹膜辨识等,都是在验证身份。
  • 授权控制,Authorization,和身份验证的英文很像。指的是将某个权限(permission)授予给某人(或某只程序)的活动。 特别注意的是,授予对象不只限于「自然人」,还包含机器人或应用程序。是建立的 Client。
  • 访问控制。Web App 在做存取资源的部分。

简单来说,这整个过程: 在决定了 某人(谁) 对于 某项资源 是否有 某种操做的权限。

在一个环形通道的一次有一扇上锁的门。我必须证明我有那门的钥匙,我只需要从一边进入,并且从另一边出来就可以。

只要能够从A进入,B出来就说明我有门钥匙

 环境说明

项目内容
seafilehttp://192.168.182.53:8003
keycloakhttp://192.168.182.52:8080
seatablehttp://192.168.11.185:8003
seafilekeycloak 的 realms 和 client
seatableKeycload 的 client ,共用 seafile 的 realms
测试用户113600006772@139.com
测试用户213600006773@139.com

参照简介的内容完成 seafile 和 keycloak 的配置,也可以直接下载配置文件运行【keycloak 配置文件 env.keycloakkeycloak.yml】【Seafile 配置文件 seafile_12.0.ymlenv.seafile

keycloak 配置

1、使用管理员 admin 登录 keycloak ,在 keycloak 中创建单独的领域 seafile ,后续的操作都基于 seafile 领域不会影响和干扰其它的应用。

2、在 seafile 领域下创建 seafile 的客户端,参照环境和下图完成 seafile 客户端配置

  • 【General Settings】-【Client ID】处填写 seafile ,【name】 和 【Description】 不是必填项,按需填写即可
  • 【Capability config】确保启用 【Client authentication】并勾选 【Authentication flow】中的 Standard flow
  • 进入【Access settings】后

3、完成后可以参照下图查看设置状态

4、查看【clients】-【Credentials】

这个是 keycloak 生成的验证密码,用于绑定 seafile 配置文件中的 OAUTH_CLIENT_SECRE 项

5、在 keycloak 中创建用户

Seafile 配置

在启用单点登录前请先确保 seafile 能正常使用,启用 sso 单点登录可以参考官网说明,具体的操作方式是在  seahub_settings.py 文件中增加 keycloak 相关的配置

##### config of keycloak ############
ENABLE_OAUTH = True
OAUTH_CREATE_UNKNOWN_USER = True
OAUTH_ENABLE_INSECURE_TRANSPORT = True
OAUTH_ACTIVATE_USER_AFTER_CREATION = True
OAUTH_CLIENT_ID = "seafile"
OAUTH_CLIENT_SECRET = "vw4S3xvmeFmb0biGmEPClCFlLoYFQ5Hw"
OAUTH_REDIRECT_URL = "http://192.168.182.53:8003/oauth/callback/"

OAUTH_PROVIDER_DOMAIN = '192.168.182.53:8003'
OAUTH_AUTHORIZATION_URL = 'http://192.168.182.52:8080/realms/seafile/protocol/openid-connect/auth'
OAUTH_TOKEN_URL = 'http://192.168.182.52:8080/realms/seafile/protocol/openid-connect/token'
OAUTH_USER_INFO_URL = 'http://192.168.182.52:8080/realms/seafile/protocol/openid-connect/userinfo'
OAUTH_SCOPE = ["openid", "profile", "email"]
OAUTH_ATTRIBUTE_MAP = {
    "sub": (True, "uid"),
    "email": (False, "contact_email"),
    "name": (False, "name")
}
##### keycloak config edn ###########

按上面的内容完成调整后重启 seafile 即可生效。

测试验证单点登录功能

1、按正常方式登录 seafile ,点击登录界面的【单点登录】按钮进入单点登录

2、点击单点登录后会自动跳转到 keycloak 的登录界面

3、在 keycloak 的登录界面输入在 keycloak 中新增的用户名和密码完成登录

4、登录后就能直接使用 seafile 的各项功能

seatable 配置

seatable 的配置和 seafile 类似,将 seatable 整合进来是想实现注册用户仅新建一次。也就是要实现直接用 seafile 配置中新建的 keycloak 用户也能在 seatable 中登录。

这里直接使用 seafile 的领域,只是在 seafile 领域下新建 client

调整 seafile 领域的会话设置

新建领域后默认的会话设置存在一个问题:当前用户退出应用后点击【单点登录】按钮不会弹出 keycloak 的登录认证界面,会直接进入对应的应用界面。为确保安全,可以通过修改领域用户的会话周期提升安全。

新建 seatable 的 client

在 seafile 领域下创建 seatable 的客户端,参照环境和下图完成 seatable 客户端配置

【General Settings】-【Client ID】处填写 seafile ,【name】 和 【Description】 不是必填项,按需填写即可
【Capability config】确保启用 【Client authentication】并勾选 【Authentication flow】中的 Standard flow
进入【Access settings】后
【Root URL】:http://192.168.11.185:8003
【Home URL】:/accounts/login
【Valid redirect URIs】:http://192.168.182.53:8003/*
                                         /oauth/callback/
【Web origins】:http://192.168.11.185:8003
【Admin URL】:http://192.168.11.185:8003

seatable 单点配置

seatable 启用单点配置和 seafile 内容存在差异,在启用单点登录前请先确保 seatable 能正常使用,启用 sso 单点登录可以参考官网说明,具体的操作方式是在  dtable_web_settings.py 文件中增加 keycloak 相关的配置

##### config of keycloak ############
ENABLE_OAUTH = True
OAUTH_CREATE_UNKNOWN_USER = True
OAUTH_ENABLE_INSECURE_TRANSPORT = True
OAUTH_ACTIVATE_USER_AFTER_CREATION = True
OAUTH_CLIENT_ID = "seatable"
OAUTH_CLIENT_SECRET = "TXKuFxc1ZK1eWwHMIY9K9rZ1K8e4npmN"
OAUTH_REDIRECT_URL = "http://192.168.11.185:8003/oauth/callback/"

OAUTH_PROVIDER_DOMAIN = '192.168.11.185:8003'
OAUTH_AUTHORIZATION_URL = 'http://192.168.182.52:8080/realms/seafile/protocol/openid-connect/auth'
OAUTH_TOKEN_URL = 'http://192.168.182.52:8080/realms/seafile/protocol/openid-connect/token'
OAUTH_USER_INFO_URL = 'http://192.168.182.52:8080/realms/seafile/protocol/openid-connect/userinfo'
OAUTH_SCOPE = ["openid", "profile", "email"]
OAUTH_ATTRIBUTE_MAP = {
    "sub": "uid",
    "email": "contact_email",
    "name":  "name"
}
##### keycloak config edn ###########