المفاهيم الأساسية
كمسؤول Casdoor، يجب أن تكون ملمًا على الأقل بأربعة مفاهيم أساسية: Organization
، User
، Application
، و Provider
.
في الأجزاء التالية، سنستخدم موقع العرض https://door.casdoor.com كمثال.
منظمة
في Casdoor، المنظمة هي حاوية للمستخدمين والتطبيقات. على سبيل المثال، يمكن تجريد جميع موظفي شركة أو جميع عملاء عمل تجاري كمنظمة واحدة. تعريف فئة Organization
موضح أدناه:
type Organization struct {
Owner string `xorm:"varchar(100) notnull pk" json:"owner"`
Name string `xorm:"varchar(100) notnull pk" json:"name"`
CreatedTime string `xorm:"varchar(100)" json:"createdTime"`
DisplayName string `xorm:"varchar(100)" json:"displayName"`
WebsiteUrl string `xorm:"varchar(100)" json:"websiteUrl"`
Favicon string `xorm:"varchar(100)" json:"favicon"`
PasswordType string `xorm:"varchar(100)" json:"passwordType"`
PasswordSalt string `xorm:"varchar(100)" json:"passwordSalt"`
PhonePrefix string `xorm:"varchar(10)" json:"phonePrefix"`
DefaultAvatar string `xorm:"varchar(100)" json:"defaultAvatar"`
Tags []string `xorm:"mediumtext" json:"tags"`
MasterPassword string `xorm:"varchar(100)" json:"masterPassword"`
EnableSoftDeletion bool `json:"enableSoftDeletion"`
IsProfilePublic bool `json:"isProfilePublic"`
AccountItems []*AccountItem `xorm:"varchar(2000)" json:"accountItems"`
}
مستخدم
في Casdoor، يمكن للمستخدم تسجيل الدخول إلى تطبيق. كل مستخدم يمكن أن ينتمي إلى منظمة واحدة فقط ولكن يمكنه تسجيل الدخول إلى تطبيقات متعددة تملكها المنظمة. حاليًا، هناك نوعان من المستخدمين في Casdoor:
- مستخدمو المنظمة
built-in
، مثلbuilt-in/admin
: المسؤولون العالميون الذين لديهم السلطة الإدارية الكاملة على منصة Casdoor. - مستخدمو المنظمات الأخرى، مثل
my-company/alice
: المستخدمون العاديون الذين يمكنهم التسجيل، تسجيل الدخول، تسجيل الخروج، تغيير ملفهم الشخصي، إلخ.
في واجهة برمجة تطبيقات Casdoor، يتم تحديد المستخدم عادةً كـ <organization_name>/<username>
. على سبيل المثال، المسؤول الافتراضي لـ Casdoor يُشار إليه كـ built-in/admin
. بالإضافة إلى ذلك، يتضمن تعريف فئة User
خاصية id
، وهي UUID مثل d835a48f-2e88-4c1f-b907-60ac6b6c1b40
ويمكن اختيارها كمعرف للمستخدم من قبل تطبيق.
بالنسبة للتطبيقات المخصصة لمنظمة واحدة فقط، من الممكن استخدام <username>
بدلاً من <organization_name>/<username>
كمعرف المستخدم عبر التطبيق للبساطة.
إليك تعريف فئة User
:
type User struct {
Owner string `xorm:"varchar(100) notnull pk" json:"owner"`
Name string `xorm:"varchar(100) notnull pk" json:"name"`
CreatedTime string `xorm:"varchar(100)" json:"createdTime"`
UpdatedTime string `xorm:"varchar(100)" json:"updatedTime"`
Id string `xorm:"varchar(100)" json:"id"`
Type string `xorm:"varchar(100)" json:"type"`
Password string `xorm:"varchar(100)" json:"password"`
PasswordSalt string `xorm:"varchar(100)" json:"passwordSalt"`
DisplayName string `xorm:"varchar(100)" json:"displayName"`
Avatar string `xorm:"varchar(500)" json:"avatar"`
PermanentAvatar string `xorm:"varchar(500)" json:"permanentAvatar"`
Email string `xorm:"varchar(100) index" json:"email"`
Phone string `xorm:"varchar(100) index" json:"phone"`
Location string `xorm:"varchar(100)" json:"location"`
Address []string `json:"address"`
Affiliation string `xorm:"varchar(100)" json:"affiliation"`
Title string `xorm:"varchar(100)" json:"title"`
IdCardType string `xorm:"varchar(100)" json:"idCardType"`
IdCard string `xorm:"varchar(100) index" json:"idCard"`
Homepage string `xorm:"varchar(100)" json:"homepage"`
Bio string `xorm:"varchar(100)" json:"bio"`
Tag string `xorm:"varchar(100)" json:"tag"`
Region string `xorm:"varchar(100)" json:"region"`
Language string `xorm:"varchar(100)" json:"language"`
Gender string `xorm:"varchar(100)" json:"gender"`
Birthday string `xorm:"varchar(100)" json:"birthday"`
Education string `xorm:"varchar(100)" json:"education"`
Score int `json:"score"`
Ranking int `json:"ranking"`
IsDefaultAvatar bool `json:"isDefaultAvatar"`
IsOnline bool `json:"isOnline"`
IsAdmin bool `json:"isAdmin"`
IsGlobalAdmin bool `json:"isGlobalAdmin"`
IsForbidden bool `json:"isForbidden"`
IsDeleted bool `json:"isDeleted"`
SignupApplication string `xorm:"varchar(100)" json:"signupApplication"`
Hash string `xorm:"varchar(100)" json:"hash"`
PreHash string `xorm:"varchar(100)" json:"preHash"`
CreatedIp string `xorm:"varchar(100)" json:"createdIp"`
LastSigninTime string `xorm:"varchar(100)" json:"lastSigninTime"`
LastSigninIp string `xorm:"varchar(100)" json:"lastSigninIp"`
Github string `xorm:"varchar(100)" json:"github"`
Google string `xorm:"varchar(100)" json:"google"`
QQ string `xorm:"qq varchar(100)" json:"qq"`
WeChat string `xorm:"wechat varchar(100)" json:"wechat"`
Facebook string `xorm:"facebook varchar(100)" json:"facebook"`
DingTalk string `xorm:"dingtalk varchar(100)" json:"dingtalk"`
Weibo string `xorm:"weibo varchar(100)" json:"weibo"`
Gitee string `xorm:"gitee varchar(100)" json:"gitee"`
LinkedIn string `xorm:"linkedin varchar(100)" json:"linkedin"`
Wecom string `xorm:"wecom varchar(100)" json:"wecom"`
Lark string `xorm:"lark varchar(100)" json:"lark"`
Gitlab string `xorm:"gitlab varchar(100)" json:"gitlab"`
Apple string `xorm:"apple varchar(100)" json:"apple"`
AzureAD string `xorm:"azuread varchar(100)" json:"azuread"`
Slack string `xorm:"slack varchar(100)" json:"slack"`
Ldap string `xorm:"ldap varchar(100)" json:"ldap"`
Properties map[string]string `json:"properties"`
}
تطبيق
يمثل تطبيق خدمة ويب تحتاج إلى الحماية من قبل Casdoor، مثل موقع منتدى، أو نظام OA، أو نظام CRM.
type Application struct {
Owner string `xorm:"varchar(100) notnull pk" json:"owner"`
Name string `xorm:"varchar(100) notnull pk" json:"name"`
CreatedTime string `xorm:"varchar(100)" json:"createdTime"`
DisplayName string `xorm:"varchar(100)" json:"displayName"`
Logo string `xorm:"varchar(100)" json:"logo"`
HomepageUrl string `xorm:"varchar(100)" json:"homepageUrl"`
Description string `xorm:"varchar(100)" json:"description"`
Organization string `xorm:"varchar(100)" json:"organization"`
Cert string `xorm:"varchar(100)" json:"cert"`
EnablePassword bool `json:"enablePassword"`
EnableSignUp bool `json:"enableSignUp"`
EnableSigninSession bool `json:"enableSigninSession"`
EnableCodeSignin bool `json:"enableCodeSignin"`
Providers []*ProviderItem `xorm:"mediumtext" json:"providers"`
SignupItems []*SignupItem `xorm:"varchar(1000)" json:"signupItems"`
OrganizationObj *Organization `xorm:"-" json:"organizationObj"`
ClientId string `xorm:"varchar(100)" json:"clientId"`
ClientSecret string `xorm:"varchar(100)" json:"clientSecret"`
RedirectUris []string `xorm:"varchar(1000)" json:"redirectUris"`
TokenFormat string `xorm:"varchar(100)" json:"tokenFormat"`
ExpireInHours int `json:"expireInHours"`
RefreshExpireInHours int `json:"refreshExpireInHours"`
SignupUrl string `xorm:"varchar(200)" json:"signupUrl"`
SigninUrl string `xorm:"varchar(200)" json:"signinUrl"`
ForgetUrl string `xorm:"varchar(200)" json:"forgetUrl"`
AffiliationUrl string `xorm:"varchar(100)" json:"affiliationUrl"`
TermsOfUse string `xorm:"varchar(100)" json:"termsOfUse"`
SignupHtml string `xorm:"mediumtext" json:"signupHtml"`
SigninHtml string `xorm:"mediumtext" json:"signinHtml"`
}
يمكن لكل تطبيق أن يكون له صفحة تسجيل خاصة به، وصفحة تسجيل دخول، والمزيد. صفحة تسجيل الدخول الرئيسية /login
(على سبيل المثال، https://door.casdoor.com/login) هي صفحة تسجيل الدخول فقط لتطبيق Casdoor المدمج: app-built-in
.
التطبيق هو "بوابة" أو "واجهة" لمستخدم لتسجيل الدخول إلى Casdoor. يجب على المستخدم المرور عبر صفحة تسجيل الدخول لتطبيق واحد لتسجيل الدخول إلى Casdoor.
عناوين URL لتسجيل الدخول
من السهل جدًا تسجيل الدخول إلى Casdoor عبر تطبيق Casdoor المدمج؛ ببساطة قم بزيارة الصفحة الرئيسية لخادم Casdoor (على سبيل المثال، https://door.casdoor.com لموقع العرض) وسيتم تحويلك تلقائيًا إلى /login
. ولكن كيف يمكنك الحصول على عناوين URLs لتطبيقات أخرى في الواجهة الأمامية والخلفية للكود؟ يمكنك إما أن تقوم بتجميع السلاسل النصية يدويًا أو استدعاء بعض الوظائف المساعدة التي توفرها حزم SDKs الخاصة بـ Casdoor للحصول على العناوين:
1. تجميع السلاسل النصية يدويًا
- عنوان URL لصفحة التسجيل
- التسجيل للتطبيق المحدد:
<your-casdoor-hostname>/signup/<your-application-name>
- التسجيل عبر OAuth:
<your-casdoor-hostname>/signup/oauth/authorize?client_id=<client-id-for-your-application>&response_type=code&redirect_uri=<redirect-uri-for-your-application>&&scope=read&state=casdoor
- التسجيل التلقائي:
<your-casdoor-hostname>/auto-signup/oauth/authorize?client_id=<client-id-for-your-application>&response_type=code&redirect_uri=<redirect-uri-for-your-application>&&scope=read&state=casdoor
- التسجيل للتطبيق المحدد:
- عنوان URL لصفحة تسجيل الدخول
- تسجيل الدخول للمنظمة المحددة:
<your-casdoor-hostname>/login/<your-organization-name>
- تسجيل الدخول عبر OAuth:
<your-casdoor-hostname>/login/oauth/authorize?client_id=<client-id-for-your-application>&response_type=code&redirect_uri=<redirect-uri-for-your-application>&&scope=read&state=casdoor
- تسجيل الدخول للمنظمة المحددة:
2. استخدام حزمة SDK الأمامية (لكود جافا سكريبت الأمامي باستخدام React, Vue, أو Angular)
getSignupUrl()
و getSigninUrl()
: casdoor-js-sdk
3. استخدام حزمة SDK الخلفية (لكود الخلفية باستخدام Go, Java, إلخ.)
GetSignupUrl()
و GetSigninUrl()
: casdoor-go-sdk
مزود
Casdoor هو نظام تسجيل دخول موحد يدعم مقدمي الهوية المتعددين عبر OIDC, OAuth, و SAML. Casdoor يمكنه أيضًا إرسال رموز التحقق أو إشعارات أخرى للمستخدمين عبر البريد الإلكتروني أو الرسائل القصيرة. Casdoor يستخدم مفهوم Provider
لإدارة جميع هذه الموصلات الخارجية.
قائمة بجميع المقدمين الذين يدعمهم Casdoor يمكن العثور عليها في provider/overview.
type Provider struct {
Owner string `xorm:"varchar(100) notnull pk" json:"owner"`
Name string `xorm:"varchar(100) notnull pk" json:"name"`
CreatedTime string `xorm:"varchar(100)" json:"createdTime"`
DisplayName string `xorm:"varchar(100)" json:"displayName"`
Category string `xorm:"varchar(100)" json:"category"`
Type string `xorm:"varchar(100)" json:"type"`
Method string `xorm:"varchar(100)" json:"method"`
ClientId string `xorm:"varchar(100)" json:"clientId"`
ClientSecret string `xorm:"varchar(100)" json:"clientSecret"`
ClientId2 string `xorm:"varchar(100)" json:"clientId2"`
ClientSecret2 string `xorm:"varchar(100)" json:"clientSecret2"`
Host string `xorm:"varchar(100)" json:"host"`
Port int `json:"port"`
Title string `xorm:"varchar(100)" json:"title"`
Content string `xorm:"varchar(1000)" json:"content"`
RegionId string `xorm:"varchar(100)" json:"regionId"`
SignName string `xorm:"varchar(100)" json:"signName"`
TemplateCode string `xorm:"varchar(100)" json:"templateCode"`
AppId string `xorm:"varchar(100)" json:"appId"`
Endpoint string `xorm:"varchar(1000)" json:"endpoint"`
IntranetEndpoint string `xorm:"varchar(100)" json:"intranetEndpoint"`
Domain string `xorm:"varchar(100)" json:"domain"`
Bucket string `xorm:"varchar(100)" json:"bucket"`
Metadata string `xorm:"mediumtext" json:"metadata"`
IdP string `xorm:"mediumtext" json:"idP"`
IssuerUrl string `xorm:"varchar(100)" json:"issuerUrl"`
EnableSignAuthnRequest bool `json:"enableSignAuthnRequest"`
ProviderUrl string `xorm:"varchar(200)" json:"providerUrl"`
}
كيف يدير Casdoor نفسه؟
عند تشغيل Casdoor للمرة الأولى، يتم إنشاء بعض الكائنات المدمجة لتسهيل إدارته:
- منظمة مدمجة باسم
built-in
. - مستخدم باسم
admin
في المنظمةbuilt-in
. - تطبيق مدمج باسم
app-built-in
, يدار من قبل منظمةbuilt-in
, يمثل Casdoor نفسه.
جميع المستخدمين تحت منظمة built-in
، بما في ذلك admin
، سيكون لديهم امتيازات المسؤول الكاملة على منصة Casdoor. لذلك، إذا كان هناك عدة مسؤولين، يُنصح بإنشاء حسابات جديدة تحت منظمة built-in
. بدلاً من ذلك، يجب إغلاق قناة التسجيل لتطبيق app-built-in
لمنع الوصول غير المرغوب فيه.
لا يمكن إعادة تسمية أو حذف الكائنات المدمجة عبر واجهة الويب أو واجهة برمجة التطبيقات RESTful. Casdoor قام بتثبيت هذه الأسماء المحجوزة في العديد من الأماكن؛ محاولة إعادة تسميتها أو حذفها عن طريق تعديل قاعدة البيانات قد يتسبب في تعطل النظام بأكمله.