Основные понятия
Как администратор 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
: обычные пользователи, которые могут регистрироваться, входить, выходить, изменять свой профиль и т. д.
В API Casdoor пользователь обычно идентифицируется как <organization_name>/<username>
. Например, стандартный администратор Casdoor обозначается как built-in/admin
. Кроме того, определение класса User
включает свойство id
, которое является UUID, например d835a48f-2e88-4c1f-b907-60ac6b6c1b40
, и может быть выбрано в качестве ID пользователя приложением.
Для приложений, предназначенных только для одной организации, можно использовать <username>
вместо <organization_name>/<username>
в качестве ID пользователя в приложении для упрощения.
Вот определение класса 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
. Но как получить URL-адреса для других приложений во фронтенде и бэкенде? Вы можете либо вручную конкатенировать строки, либо вызвать некоторые вспомогательные функции, предоставляемые SDK Casdoor, чтобы получить URL-адреса:
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 (для фронтенд JavaScript кода, использующего React, Vue или Angular)
getSignupUrl()
и getSigninUrl()
: casdoor-js-sdk
3. Использование бэкенд SDK (для бэкенд кода, использующего Go, Java и т. д.)
GetSignupUrl()
и GetSigninUrl()
: casdoor-go-sdk
Провайдер
Casdoor - это федеративная система единого входа, поддерживающая множество поставщиков идентификации через OIDC, OAuth и SAML. Casdoor также может отправлять коды подтверждения или другие уведомления пользователям по электронной почте или SMS. 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 API. Casdoor закодировал эти зарезервированные имена во многих местах; попытка переименовать или удалить их, изменив БД, может привести к сбою всей системы.