草庐IT

Casdoor + OAuth 实现单点登录 SSO

Casbin开源社区 2023-03-28 原文

简介

Casdoor 是一个基于 OAuth 2.0 / OIDC 的中心化的单点登录(SSO)身份验证平台,简单来说,就是 Casdoor 可以帮你解决用户管理的难题,你无需开发用户登录、注册等与用户鉴权相关的一系列功能,只需几个步骤进行简单配置,与你的主应用配合,便可完全托管你的用户模块,简单省心,功能强大。Casdoor 目前作为 Casbin 社区项目统一使用的鉴权平台,并且项目已开源。

仓库地址:https://github.com/casbin/casdoor

演示地址:https://door.casbin.com/

官网文档:https://casdoor.org/

为什么要用 Casdoor?

用户管理一直是项目中非常令人头疼的一个问题,不仅要确保安全性,功能是否完整,方便使用也十分重要。目前大多数应用已从过去单一的账号密码登录,逐渐升级为允许通过第三方平台登录,例如 GitHub 、微信、QQ 等,但是这一套逻辑依然需要开发者去实现,大多数功能偏离了业务。

Casdoor 就是替开发者们解决这个难题,即提供一套统一的鉴权平台,只需要简单配置便可完全托管用户模块,功能完备,配置简单,上手难度低。它具有以下特性:

  1. 前后端分离的架构,前端使用react,后端使用 Go 语言开发,Casdoor 支持高并发,提供基于Web的用户管理 UI,并支持中、英等多种语言

  1. Casdoor 支持 Github, Google, QQ, WeChat, Facebook, Gitee 等第三方应用程序登录,并支持使用插件扩展第三方登录

  2. 使用 Casbin 基于授权管理,Casdoor 支持 ACL, RBAC, ABAC, RESTful 等访问控制模型

  3. 个性化的注册、登录和忘记密码页面。支持手机验证码、邮件验证码、找回密码等功能

  4. 使用阿里云、腾讯云、七牛云提供的图片CDN云存储

  5. Casdoor 支持使用 db 同步方法与现有系统的集成,用户可以顺利过渡到Casdoor

  6. Casdoor 支持的主流数据库: MySQL, SQL Server, PostgreSQL 等, 并支持扩展插件的新数据库

工作原理

首先,Casdoor 的授权程序建立在 OAuth 2 的基础上:OAuth 2 是一个工业级别的开发授权协议,可以使用户授权第三方网站/应用访问他们在特定网站上的信息,而不必向第三方网站/应用提供密码。

整个过程如下图所示,一共分成六个步骤:向用户发送授权请求、获得授权认证、向授权服务器发送授权认证并验证、获取访问令牌、给资源服务器发送访问令牌、获得受保护的资源。

如何连接到Casdoor?

作为服务提供商(SP),Casdoor 支持两项认证协议:OAuth 2.0 (OIDC) 和 SAML;作为身份提供商 (Idp),Casdoor 也支持两个认证协议:OAuth 2.0 (OIDC) 和 CAS 2.0。

因此,您的应用程序将通过 OAuth 2.0 (OIDC) 与 Casdoor 连接。 具体而言,有三种方式:

1. 标准OIDC 客户端

Casdoor 完全实现了OIDC协议。 如果您的应用程序已经运行了另一个 OAuth 2,那么 (OIDC) 身份提供商一般会通过标准的 OIDC 客户端库提供服务,如果您想要迁移到Casdoor, 使用 OIDC discovery会帮助您非常容易地切换到Casdoor。Casdoor's OIDC discovery URL 是

<your-casdoor-backend-host>/.well-known/openid-configuration

2. Casdoor SDK

与标准的 OIDC 协议相比,Casdoor 在 SDK 中提供了更多的功能,如用户管理、资源上传等。 通过 Casdoor SDK 连接到 Casdoor 的成本比使用 OIDC 标准客户端库更高,并将提供灵活性最佳和最强大的 API。

Casdoor SDK可分为两类:前端sdk和后端sdk

前端sdk 源码地址
JavaScript sdk https://github.com/casdoor/casdoor-js-sdk
Vue sdk https://github.com/casdoor/casdoor-vue-sdk
Android sdk https://github.com/casdoor/casdoor-android-sdk
IOS sdk https://github.com/casdoor/casdoor-ios-sdk
后端sdk 源码地址
Go sdk https://github.com/casdoor/casdoor-go-sdk
Java sdk https://github.com/casdoor/casdoor-java-sdk
Node.js sdk https://github.com/casdoor/casdoor-nodejs-sdk
Python sdk https://github.com/casdoor/casdoor-python-sdk
PHP sdk https://github.com/casdoor/casdoor-php-sdk
.NET sdk https://github.com/casdoor/casdonet-sdk

前后端配置的详细方法请参考文档

https://casdoor.org/zh/docs/how-to-connect/sdk

3. Casdoor 插件

如果您的应用是建立在一个流行的平台上,并且Casdoor(或第三方) 已经为它提供了一个插件或中间件,那么就可以直接使用。它比手动使用 Casdoor SDK 更容易使用,因为前者是专门为平台制作的。

Casdoor为一些热门平台提供插件或中间件,例如Java的SpringBoot、PHP的WordPress、Python的Odoo等

效果演示

Casnode 是Casbin社区开发的官方论坛,它使用的就是 Casdoor 作为认证平台并管理成员。下面以 Casnode 的登陆为例演示 Casdoor 的使用效果。

https://forum.casbin.com/

点击右上角的登录按钮

进入登录选择界面,可以选择一个你信任的或常用的平台进行授权

授权之后会进入登录页面,以 Google, Wechat, QQ, Gitee 为例

登录成功之后可以在设置里查看用户信息,并且可以绑定其他平台的账号,以便下次登陆

写在最后

我们希望 Casdoor 能帮助广大开发者们解决用户管理的难题,更专注主要业务,提高开发效率。同时作为一个开源项目,我们也非常希望获得大家的使用建议,帮助我们更好地改善项目质量,从功能、易用性等方面更好地满足大家的需求。

如果使用过程中有任何疑问,欢迎加入社区 QQ 群交流(QQ群:645200447),提 Issues、提 PR 也是十分欢迎的!

有关Casdoor + OAuth 实现单点登录 SSO的更多相关文章

  1. ruby - 如何根据特征实现 FactoryGirl 的条件行为 - 2

    我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden

  2. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

  3. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  4. MIMO-OFDM无线通信技术及MATLAB实现(1)无线信道:传播和衰落 - 2

     MIMO技术的优缺点优点通过下面三个增益来总体概括:阵列增益。阵列增益是指由于接收机通过对接收信号的相干合并而活得的平均SNR的提高。在发射机不知道信道信息的情况下,MIMO系统可以获得的阵列增益与接收天线数成正比复用增益。在采用空间复用方案的MIMO系统中,可以获得复用增益,即信道容量成倍增加。信道容量的增加与min(Nt,Nr)成正比分集增益。在采用空间分集方案的MIMO系统中,可以获得分集增益,即可靠性性能的改善。分集增益用独立衰落支路数来描述,即分集指数。在使用了空时编码的MIMO系统中,由于接收天线或发射天线之间的间距较远,可认为它们各自的大尺度衰落是相互独立的,因此分布式MIMO

  5. 【Java入门】使用Java实现文件夹的遍历 - 2

    遍历文件夹我们通常是使用递归进行操作,这种方式比较简单,也比较容易理解。本文为大家介绍另一种不使用递归的方式,由于没有使用递归,只用到了循环和集合,所以效率更高一些!一、使用递归遍历文件夹整体思路1、使用File封装初始目录,2、打印这个目录3、获取这个目录下所有的子文件和子目录的数组。4、遍历这个数组,取出每个File对象4-1、如果File是否是一个文件,打印4-2、否则就是一个目录,递归调用代码实现publicclassSearchFile{publicstaticvoidmain(String[]args){//初始目录Filedir=newFile("d:/Dev");Datebeg

  6. ruby - Arrays Sets 和 SortedSets 在 Ruby 中是如何实现的 - 2

    通常,数组被实现为内存块,集合被实现为HashMap,有序集合被实现为跳跃列表。在Ruby中也是如此吗?我正在尝试从性能和内存占用方面评估Ruby中不同容器的使用情况 最佳答案 数组是Ruby核心库的一部分。每个Ruby实现都有自己的数组实现。Ruby语言规范只规定了Ruby数组的行为,并没有规定任何特定的实现策略。它甚至没有指定任何会强制或至少建议特定实现策略的性能约束。然而,大多数Rubyist对数组的性能特征有一些期望,这会迫使不符合它们的实现变得默默无闻,因为实际上没有人会使用它:插入、前置或追加以及删除元素的最坏情况步骤复

  7. ruby - "public/protected/private"方法是如何实现的,我该如何模拟它? - 2

    在ruby中,你可以这样做:classThingpublicdeff1puts"f1"endprivatedeff2puts"f2"endpublicdeff3puts"f3"endprivatedeff4puts"f4"endend现在f1和f3是公共(public)的,f2和f4是私有(private)的。内部发生了什么,允许您调用一个类方法,然后更改方法定义?我怎样才能实现相同的功能(表面上是创建我自己的java之类的注释)例如...classThingfundeff1puts"hey"endnotfundeff2puts"hey"endendfun和notfun将更改以下函数定

  8. ruby - 实现k最近邻需要哪些数据? - 2

    我目前有一个reddit克隆类型的网站。我正在尝试根据我的用户之前喜欢的帖子推荐帖子。看起来K最近邻或k均值是执行此操作的最佳方法。我似乎无法理解如何实际实现它。我看过一些数学公式(例如k表示维基百科页面),但它们对我来说并没有真正意义。有人可以推荐一些伪代码,或者可以查看的地方,以便我更好地了解如何执行此操作吗? 最佳答案 K最近邻(又名KNN)是一种分类算法。基本上,您采用包含N个项目的训练组并对它们进行分类。如何对它们进行分类完全取决于您的数据,以及您认为该数据的重要分类特征是什么。在您的示例中,这可能是帖子类别、谁发布了该项

  9. ruby-on-rails - Rails 两条腿的 OAuth 提供商? - 2

    我有一个Rails2.3.5应用程序,其中包含我希望保护的API。没有用户-它是一个应用到应用风格的网络服务(更像是亚马逊服务而不是facebook),所以我想使用两条腿的OAuth方法来实现它。我一直在尝试使用oauth-plugin服务器实现作为开始:http://github.com/pelle/oauth-plugin...但它的构建需要三足(网络重定向流)oauth。在我深入研究对其进行更改以支持两条腿之前,我想看看是否有更简单的方法,或者是否有人有更好的方法让Rails应用程序实现成为两条腿的OAuth提供程序。 最佳答案

  10. ruby-on-rails - 使用 Ruby 正确处理 Stripe 错误和异常以实现一次性收费 - 2

    我查看了Stripedocumentationonerrors,但我仍然无法正确处理/重定向这些错误。基本上无论发生什么,我都希望他们返回到edit操作(通过edit_profile_path)并向他们显示一条消息(无论成功与否)。我在edit操作上有一个表单,它可以POST到update操作。使用有效的信用卡可以正常工作(费用在Stripe仪表板中)。我正在使用Stripe.js。classExtrasController5000,#amountincents:currency=>"usd",:card=>token,:description=>current_user.email)

随机推荐