跳到主内容

APISIX

目前,有两种方法可以使用Casdoor通过APISIX插件连接到APISIX并保护APISIX后面的API:使用APISIX的Casdoor插件或使用APISIX的OIDC插件。

通过 APISIX 的 Casdoor 插件连接 Casdoor

这个插件,authz-casdoor,可以保护APISIX后面的API,强制每一个请求都要经过身份验证,而无需修改API的代码。

如何启用它?

在创建路由时,您需要指定此插件并提供所有必需的字段。 参见下面的示例。

curl "http://127.0.0.1:9180/apisix/admin/routes/1" -H "X-API-KEY: edd1c9f034335f136f87ad84b625c8f1" -X PUT -d '
{
"methods": ["GET"],
"uri": "/anything/*",
"plugins": {
"authz-casdoor": {
"endpoint_addr":"http://localhost:8000",
"callback_url":"http://localhost:9080/anything/callback",
"client_id":"7ceb9b7fda4a9061ec1c",
"client_secret":"3416238e1edf915eac08b8fe345b2b95cdba7e04"
}
},
"upstream": {
"type": "roundrobin",
"nodes": {
"httpbin.org:80": 1
}
}
}'

在这个例子中,我们使用APISIX的管理员API,创建了一个指向"httpbin.org:80"的路由"/anything/*",并启用了"authz-casdoor"插件。 此路由现在已在Casdoor的身份验证保护之下。

属性

名称类型申请标准默认有效期描述
endpoint_addr字符串必填Casdoor的URL。
client_id字符串必填Casdoor中的客户端ID。
client_secret字符串必填Casdoor中的客户端密钥。
callback_url字符串必填用于接收状态和代码的回调URL。

endpoint_addr 和 callback_url 不应以“/”结尾

在"authz-casdoor"插件的配置中,我们可以看到四个参数。

第一个是“callback_url”。 这是OAuth2中的回调URL。 应强调的是,这个回调URL 必须属于您为路由指定的"uri"。 例如,在这个例子中,http://localhost:9080/anything/callback 显然属于 "/anything/*"。 只有通过这种方式,插件才能拦截并利用对callback_url的访问(这样插件就可以获取OAuth2中的代码和状态)。 callback_url的逻辑完全由插件实现,因此无需修改服务器来实现此回调。

第二个参数 "endpoint_addr" 显然是 Casdoor 的 URL。 第三个和第四个参数是“client_id”和“client_secret”,您可以在注册应用程序时从Casdoor获取这些参数。

它是如何工作的?

假设一个从未访问过此路由的新用户即将访问它(http://localhost:9080/anything/d?param1=foom2=bar)。 考虑到"authz-casdoor"已启用,此访问将首先由"authz-casdoor"插件处理。 在检查会话并确认该用户尚未通过身份验证后,将会拦截此次访问。 保留用户想要访问的原始URL,他们将被重定向到Casdoor的登录页面。

在成功使用用户名和密码(或他们使用的任何其他方法)登录后,Casdoor会将此用户重定向到带有GET参数“code”和“state”的“callback_url”。 因为"callback_url"是由插件知道的,所以当这次对"callback_url"的访问被拦截时,将会触发OAuth2中的"Authorization code Grant Flow"逻辑。 这意味着插件将请求访问令牌以确认此用户是否真的已登录。 经过这个确认后,插件将会把用户重定向到他们想要访问的原始URL,这个URL是我们之前保存的。 已登录的状态也将保留在会话中。

下次此用户想要访问此路由背后的URL(例如,http://localhost:9080/anything/d),在发现此用户之前已经被认证后,这个插件不再重定向此用户。 这样,用户可以在不受干扰的情况下访问此路由下的任何内容。

通过 APISIX 的 OIDC 插件连接 Casdoor

Casdoor可以使用OIDC协议连接到APISIX,本文档将向您展示如何操作。

以下是配置中使用的一些名称:

CASDOOR_HOSTNAME:部署Casdoor服务器的域名或IP。

APISIX_HOSTNAME: 部署 APISIX 的域名或 IP。

步骤1:部署Casdoor和APISIX

首先,部署CasdoorAPISIX

在成功部署后,您需要确保:

  1. 可以登录并正常使用Casdoor。
  2. 将Casdoor的 origin 值 (conf/app.conf) 设置为 CASDOOR_HOSTNAMECasdoor 配置

步骤2:配置Casdoor应用程序

  1. 创建一个新的Casdoor应用程序,或使用一个已经存在的。
  2. 添加一个重定向URL:http://APISIX_HOSTNAME/REDIRECTWHATYOUWANT,并将REDIRECTWHATYOUWANT替换为所需的重定向URL。
  3. 选择 "JWT-Empty" 作为令牌格式选项。
  4. 添加所需的提供商并配置其他设置。

应用设置 在应用设置页面上,您将找到如上图所示的Client IDClient Secret值。 我们将在下一步中使用它们。

打开你最喜欢的浏览器并访问:http://CASDOOR_HOSTNAME/.well-known/openid-configuration,在那里你会找到Casdoor的OIDC配置。

步骤3:配置APISIX

APISIX 拥有官方 OIDC 支持,由 lua-resety-openidc 实现。

您可以根据APISIX OIDC文档自定义设置。 以下路由设置将被使用:

# 使用您自己的X-Api-Key
$ curl -X POST APISIX_HOSTNAME/apisix/admin/routes -H "X-Api-Key: edd1c9f034335f136f87ad84b625c8f1" -d '{
"uri": "/get",
"name": "apisix_casdoor_test",
"plugins": {
"openid-connect": {
"client_id": "客户端ID",
"client_secret": "客户端密钥",
"discovery": "http://CASDOOR_HOSTNAME/.well-known/openid-configuration",
"introspection_endpoint_auth_method": "client_secret_basic",
"logout_path": "/logout",
"realm": "master",
"redirect_uri": "http://APISIX_HOSTNAME/REDIRECTWHATYOUWANT",
"bearer_only": false,
"set_id_token_header": false,
"access_token_in_authorization_header": true,
"set_access_token_header": true,
"set_userinfo_header": false,
"realm": "master"
}
},
"upstream": {
"type": "roundrobin",
"nodes": {
"httpbin.org:80": 1
}
}
}'

现在,访问http://APISIX_HOSTNAME/get,浏览器将会重定向你到Casdoor登录页面。 成功登录后,你会看到已经向httpbin.org发送了一个请求,如下面的截图所示。 APISIX_Result