开源统一身份认证系统:CasDoor

484次阅读
没有评论

共计 8181 个字符,预计需要花费 21 分钟才能阅读完成。

背景

用户管理是多平台项目一直以来的痛点。不同平台之间用户割裂,各自维护一套单一密码。

我在家中也维护了许多服务,例如堡垒机、GitLab、Harbor、Jenkins、Grafana、夜莺等等。接入一套统一鉴权平台托管用户模块可以降低用户管理的复杂度。

CasDoor 是什么

CasDoor 是一个基于 OAuth 2.0 / OIDC 的身份认证和管理平台(Identity Access Management,IAM)。

它能够提供多种认证方式:

  • 用户名/密码、手机验证码、邮箱验证码、2FA
  • 支持第三方登录(GitHub、Google、微信等)
  • 支持多种验证方式,例如SSO、auth0、CAS等
  • 提供用户管理和权限管理功能

部署

IP:192.168.2.10

Docker Compose

参考链接:casdoor.org/zh/docs/basic/try-with-dockergithub.com/casdoor/casdoor

官方文档提供的 docker-compose.yml​ 还需要自行构建镜像,用起来不方便。

支持多种数据库驱动。

数据库使用 Postgres :

mkdir /usr/local/casdoor && cd /usr/local/casdoor

# vim docker-compose.yml
version: '3'
services:
  casdoor:
    image: casbin/casdoor:latest
    container_name: casdoor
    entrypoint: /bin/sh -c './server --createDatabase=true'  # 关键配置:自动创建数据库表
    ports:
      - "8011:8000"
    depends_on:
      casdoor-postgres:
        condition: service_healthy
    environment:
      RUNNING_IN_DOCKER: "true"
      driverName: "postgres"
      dataSourceName: 'user=postgres password=thisispassword123 host=casdoor-postgres port=5432 sslmode=disable dbname=casdoor'
      origin: "http://192.168.2.10:8011"
      runmode: 'dev'
    volumes:
      - ./init_data.json:/init_data.json
    restart: unless-stopped

  casdoor-postgres:
    image: postgres:17-alpine
    container_name: casdoor-postgres
    environment:
      POSTGRES_PASSWORD: "thisispassword123"
    volumes:
      - ./postgres_data:/var/lib/postgresql/data
    ports:
      - "5433:5432"
    healthcheck:
      test: ['CMD-SHELL', 'pg_isready -U postgres']
      interval: 5s
      timeout: 5s
      retries: 5
    restart: always

# docker-compose up -d 
# docker-compose ps 

数据库使用 MySQL:

# vim docker-compose.yml
version: '3'
services:
  casdoor:
    image: casbin/casdoor:latest
    container_name: casdoor
    entrypoint: /bin/sh -c './server --createDatabase=true'  # 关键配置:自动创建数据库表
    ports:
      - "8011:8000"
    depends_on:
      - casdoor-mysql
    environment:
      RUNNING_IN_DOCKER: "true"
      driverName: "mysql"
      dataSourceName: "root:testpassword123@tcp(casdoor-mysql:3306)/"
      dbName : "casdoor"
      origin: "https://***casdoor.opshub.cn:"
    restart: unless-stopped

  casdoor-mysql:
    image: mysql:8.0.25
    container_name: casdoor-mysql
    environment:
      MYSQL_ROOT_PASSWORD: "testpassword123"
      MYSQL_DATABASE: "casdoor"
    volumes:
      - ./mysql_data:/var/lib/mysql
    ports:
      - "3376:3306"
    restart: unless-stopped

# docker-compose up -d 
# docker-compose ps 

默认账号:admin
默认密码:123

Nginx 反代

参考链接:casdoor.org/zh/docs/deployment/nginx/

# cat /etc/nginx/conf.d/***.opshub.cn.conf 
upstream casdoor {
  server 192.168.2.10:8011;
}

server {
  listen 80;
  server_name ***.opshub.cn;
  return 301 https://$server_name$request_uri;
}

server {
  listen 443 ssl;
  http2 on;
  server_name ***.opshub.cn;

  ssl_certificate     /root/.acme.sh/*.opshub.cn/fullchain.cer;
  ssl_certificate_key /root/.acme.sh/*.opshub.cn/*.opshub.cn.key;
  ssl_session_timeout 5m;
  ssl_protocols TLSV1 TLSv1.1 TLSv1.2;
  ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
  ssl_prefer_server_ciphers on;

  location / {
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto https;
    proxy_redirect http:// https://;
    proxy_pass http://casdoor;
  }
}

配置好dns解析后,使用浏览器访问域名验证:

开源统一身份认证系统:CasDoor

开源统一身份认证系统:CasDoor

使用

CasDoor 的配置项很繁杂,下文以简单案例演示,只进行必要的配置快速接入。

服务端配置

修改默认密码:

访问链接:CASDOO_RDOMAIN/account

开源统一身份认证系统:CasDoor

创建组织:

用户管理 –> 组织 –> 添加组织 –> organization_pyw_test

开源统一身份认证系统:CasDoor

创建测试用户:

用户管理 –> 用户 –> 添加用户:pyw-test

开源统一身份认证系统:CasDoor

其他配置保持默认。

创建应用:

身份认证 –> 应用 –> 添加应用

每个应用对应了不同的接入客户端,需要配置不一样的重定向 URLs 及其他配置项。后续章节展开说明。

客户端接入

CasDoor 提供了多种接入方式:casdoor.org/zh/docs/category/how-to-connect-to-casdoor

  1. 标准 OIDC 客户端:支持 OpenID Connect (OIDC),这是一个基于 OAuth2 协议的身份层,用于简化身份验证流程。
  2. Casdoor SDKs:使用 Casdoor SDKs 而不是标准的 OIDC 协议。
  3. Casdoor Authenticator App:在 Casdoor 中存储 TOTP 代码。
  4. 单点登录
  5. LDAP:支持 LDAP(轻量级目录访问协议),这是一种用于访问和维护分布式目录信息服务的协议。
  6. Vue SDK:Casdoor 提供的 Vue SDK。
  7. 桌面 SDK
  8. 移动 SDKs
  9. Casdoor 插件:在 Spring Boot、WordPress、Odoo 等其他框架中使用 Casdoor 插件或中间件。
  10. Next.js:在 Next.js 项目中使用 Casdoor。
  11. Nuxt:在 Nuxt 项目中使用 Casdoor。
  12. OAuth 2.0:支持 OAuth2 协议,允许第三方应用通过授权码模式、密码模式、客户端模式等获取访问令牌(Access Token)。
  13. CAS :支持 CAS(Central Authentication Service),这是一种单点登录(SSO)协议,用于在多个应用之间共享用户身份。
  14. SAML:支持 SAML2 协议,这是一种基于 XML 的开放标准,用于在不同系统之间交换认证和授权数据。
  15. 面部识别:使用 Face ID 登录到 Casdoor。
  16. API:提供了 RESTful API,允许开发者直接通过 API 进行用户管理和身份验证。

不同客户端应用支持的验证方式不一致,得益于 CasDoor 提供了完备的接入方式,下文一一介绍。

需要注意的是此处 CasDoor 的设计不太好,CAS 接入方式的名称字段作为了唯一标志。

JumpServer

Jumpserver 支持 基本、LDAP、CAS、Passkey 登录方式接入,以 CAS 为例。

在 CasDoor 创建应用:jumpserver

回调地址:https://JUMPSERVER_DOMAIN

开源统一身份认证系统:CasDoor

开源统一身份认证系统:CasDoor

Jumpserver 安全设置: 取消勾选仅存在用户登录

系统设置 — > 安全设置

开源统一身份认证系统:CasDoor

Jumpserver 认证设置:CAS接入

系统设置 –> 认证设置

开源统一身份认证系统:CasDoor

登陆验证:

开源统一身份认证系统:CasDoor

开源统一身份认证系统:CasDoor

开源统一身份认证系统:CasDoor

夜莺

夜莺支持 OAuth2、LDAP、CAS 、OIDC 四种登录方式接入,以 CAS 为例。

在 CasDoor 创建应用:n9e

回调地址:https://N9E_DOMAIN/callback/cas

开源统一身份认证系统:CasDoor

开源统一身份认证系统:CasDoor

其他配置保持默认。

夜莺配置:CAS接入

# 是否启用 CAS 登录功能 参数选项 true/false
Enable = true

# CAS 登录方式在前端显示的名称
DisplayName = 'CAS登录'

# CAS 认证成功后的重定向URL。这个URL应该是夜莺监控服务的回调地址
RedirectURL = 'https://***.opshub.cn/callback/cas'

# SSO 服务 cas 的地址
SsoAddr = 'https://***.opshub.cn/cas/organization_pyw_test/n9e'

# SSO 服务 cas 的登出地址,用于处理用户退出登录的请求
#SsoLogoutAddr = 'https://***.opshub.cn/cas/organization_pyw_test/n9e/logout'

# SSO 服务 cas 登录的 path;与 SsoAddr 拼接得到完整的登录地址
LoginPath = '/login'

# 是否覆盖用户属性 参数选项 true/false
CoverAttributes = true

# 用户在夜莺系统中的默认角色 Guest/Standard/Admin
DefaultRoles = ['Standard']

# 请求的 CAS 范围
Scopes = ['openid', 'profile', 'email', 'phone']

# CAS 的用户属性映射 n9e 的用户属性
[Attributes]
# 用户名字段的映射
Username = 'sub'
# 昵称字段的映射
Nickname = 'nickname'
# 电话字段的映射
Phone = 'phone_number'
# email 字段映射
Email = 'email'

开源统一身份认证系统:CasDoor

登录验证:

开源统一身份认证系统:CasDoor

开源统一身份认证系统:CasDoor

Grafana

参考链接:grafana.com/docs/grafana/latest/setup-grafana/configure-security…

Grafana 支持多种身份验证方式,以 Generic OAuth2 为例。

在 CasDoor 创建应用:grafana

回调地址:https://GRAFANA_DOMAIN/login/generic_oauth

开源统一身份认证系统:CasDoor

开源统一身份认证系统:CasDoor

grafana 服务端配置:

# vim /etc/grafana/grafana.ini
[auth.generic_oauth]
enabled = true
name = Casdoor
client_id = ba93935384c77a0e8125
client_secret = b80847a0aab3c5d00469c2fa267abf87f119b4b7
scopes = user:email read:org
auth_url = https://***.opshub.cn/login/oauth/authorize
token_url = https://***.opshub.cn/api/login/oauth/access_token
api_url = https://***.opshub.cn/api/userinfo
allow_sign_up = true

# 使Grafana不同步Casdoor的用户权限,否则Grafana不能修改使用Casdoor接入用户的权限
skip_org_role_sync = true
oauth_skip_org_role_update_sync = true


登录验证:

开源统一身份认证系统:CasDoor

开源统一身份认证系统:CasDoor

开源统一身份认证系统:CasDoor

GitLab

参考链接:casdoor.org/zh/docs/integration/ruby/gitlab/blog.csdn.net/weixin_52270081/article/details/144580436

以OIDC接入为例。

在 CasDoor 创建应用:gitlab

回调地址:https://GITLAB_DOMAIN/users/auth/openid_connect/callback

开源统一身份认证系统:CasDoor

开源统一身份认证系统:CasDoor

其他配置保持默认

gitlab 服务端配置:

# vim ./config/gitlab.rb
external_url 'https://***.opshub.cn'
nginx['listen_port'] = 30080
nginx['listen_https'] = false
nginx['proxy_set_headers'] = {
  "X-Forwarded-Proto" => "https",
  "X-Forwarded-Ssl" => "on",
  "Host" => "$http_host",
  "X-Real-IP" => "$remote_addr",
  "X-Forwarded-For" => "$proxy_add_x_forwarded_for"
}

gitlab_rails['gitlab_username_changing_enabled'] = false
gitlab_rails['omniauth_auto_link_user'] = true
gitlab_rails['omniauth_allow_single_sign_on'] = ['openid_connect']
gitlab_rails['omniauth_block_auto_created_users'] = false
gitlab_rails['omniauth_providers'] = [
    {
        name: "openid_connect",
        label: "Casdoor", # 可选的登录按钮标签,默认为 "Openid Connect"
        args: {
            name: "openid_connect",
            scope: ["openid", "profile", "email"],
            response_type: "code",
            issuer:  "https://***.opshub.cn",
            client_auth_method: "query",
            discovery: true,
            uid_field: "preferred_username",
            client_options: {
                identifier: "77999c17d50484500b55",
                secret: "f5550466c7ad0f35efc0873a46839d7574192470",
                redirect_uri: "https://***.opshub.cn/users/auth/openid_connect/callback"
            }
        }
    }
]

# 重建配置并重启服务
# gitlab-ctl reconfigure
# gitlab-ctl restart

登录验证:

开源统一身份认证系统:CasDoor

开源统一身份认证系统:CasDoor

开源统一身份认证系统:CasDoor

Jenkins

参考链接:casdoor.org/zh/docs/integration/java/jenkins-oidc/

以OIDC接入为例。

在 CasDoor 创建应用:jenkins

回调地址:https://JENKINS_DOMAIN/securityRealm/finishLogin

开源统一身份认证系统:CasDoor

Jenkins 服务端配置:

需要注意,当 Jenkins 配置第三方接入方式后,无法再支持本地验证。所以在配置时注意现将授权策略配置为:允许授权用户做任何事​,避免第三方接入账号权限不够,而默认的admin又无法登陆。

最好在执行配置前进行备份。

Dashboard –> 系统管理 –> 插件管理 –> Available plugins –> 安装 OpenId Connect Authentication

开源统一身份认证系统:CasDoor

系统管理 –> 全局安全配置
自动发现ODIC配置URL:https://CASDOOR\_HOSTNAME/.well-known/openid-configuration

开源统一身份认证系统:CasDoor

开源统一身份认证系统:CasDoor

开源统一身份认证系统:CasDoor

登录验证:

开源统一身份认证系统:CasDoor

开源统一身份认证系统:CasDoor

Harbor

关于如何部署 Harbor,可参考站内文章:Harbor 镜像仓库部署

Harbor 默认登录方式为本地数据库:postgres​。如果本地数据库中已经存在除 admin/anonymous 之外的用户,则不能再直接修改认证方式。

将现有用户在数据库中删除后,才能够进行修改。只在web控制端上删除用户仅是添加了一个删除tag,必须在数据库中执行物理删除。

删除用户为破坏性操作,生产环境评估后再执行。

删除前:

开源统一身份认证系统:CasDoor

# 进入容器
docker exec -it harbor-db /bin/bash

# 登录数据库
psql -U postgres -d registry

# 查找用户
select * from harbor_user;

# 删除用户
delete from harbor_user where username='my-wordpress';
delete from harbor_user where username='jenkins-my-wordpress';

删除后:

开源统一身份认证系统:CasDoor

此时 Harbor web端才能正常选择认证模式:

开源统一身份认证系统:CasDoor

参考链接:goharbor.io/docs/1.10/administration/configure-authentication/oi…

以 OIDC 接入为例。

在 CasDoor 创建应用:harbor

回调地址:https://HARBOR_DOMAIN/c/oidc/callback

开源统一身份认证系统:CasDoor

Harbor 服务端配置:

开源统一身份认证系统:CasDoor

可以看到有一行提示:`请确保将OIDC提供的重定向地址设置为 http://192.168.2.10:8083/c/oidc/callback`​

由于我使用了外部nginx反向代理harbor,所以需要修改配置文件:

# vim harbor.yml
hostname: ***.opshub.cn
external_url: https://***.opshub.cn

# 生成配置
./prepare

# 重启服务
docker-compose down -v
docker-compose up -d

页面提示会发生变化:

开源统一身份认证系统:CasDoor

登录验证:

开源统一身份认证系统:CasDoor

开源统一身份认证系统:CasDoor

总结

文章介绍了6个平台的简单接入,实际生产使用需要进行更多配置项的评估,例如用户组、权限等,确保认证安全。

引用链接

正文完
 
pengyinwei
版权声明:本站原创文章,由 pengyinwei 2025-02-05发表,共计8181字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处:https://www.opshub.cn
评论(没有评论)