Conceptos fundamentales
Como administrador de Casdoor, debes estar familiarizado con al menos cuatro conceptos fundamentales: Organization
, User
, Application
y Provider
.
En las siguientes partes, usaremos el sitio de demostración https://door.casdoor.com como ejemplo.
Organización
En Casdoor, una organización es un contenedor para usuarios y aplicaciones. Por ejemplo, todos los empleados de una empresa o todos los clientes de un negocio pueden ser abstraídos como una organización. La definición de la clase Organization
se muestra a continuación:
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"`
}
Usuario
En Casdoor, un usuario puede iniciar sesión en una aplicación. Cada usuario puede pertenecer solo a una organización pero puede iniciar sesión en múltiples aplicaciones propiedad de la organización. Actualmente, hay dos tipos de usuarios en Casdoor:
- usuarios de la organización
built-in
, comobuilt-in/admin
: administradores globales que tienen pleno poder administrativo en la plataforma Casdoor. - Usuarios de otras organizaciones, como
my-company/alice
: usuarios normales que pueden registrarse, iniciar sesión, cerrar sesión, cambiar su propio perfil, etc.
En la API de Casdoor, un usuario se identifica típicamente como <organization_name>/<username>
. Por ejemplo, el administrador predeterminado de Casdoor se denota como built-in/admin
. Además, la definición de la clase User
incluye una propiedad id
, que es un UUID como d835a48f-2e88-4c1f-b907-60ac6b6c1b40
y puede ser elegido como ID de usuario por una aplicación.
Para aplicaciones que son solo para una organización, es posible usar <username>
en lugar de <organization_name>/<username>
como ID de usuario en toda la aplicación por simplicidad.
Aquí está la definición de la clase 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"`
}
Aplicación
Una aplicación representa un servicio web que necesita ser protegido por Casdoor, como un sitio de foros, un sistema OA o un sistema 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"`
}
Cada aplicación puede tener su propia página de registro personalizada, página de inicio de sesión y más. La página de inicio de sesión raíz /login
(por ejemplo, https://door.casdoor.com/login) es la página de inicio de sesión solo para la aplicación integrada de Casdoor: app-built-in
.
Una aplicación es un "portal" o "interfaz" para que un usuario inicie sesión en Casdoor. Un usuario debe pasar por la página de inicio de sesión de una aplicación para iniciar sesión en Casdoor.
URLs de inicio de sesión
Es muy fácil iniciar sesión en Casdoor a través de la aplicación integrada de Casdoor; simplemente visita la página de inicio del servidor de Casdoor (por ejemplo, https://door.casdoor.com para el sitio de demostración) y automáticamente te redirigirá a /login
. Pero, ¿cómo obtienes las URLs para otras aplicaciones en el código frontend y backend? Puedes concatenar cadenas manualmente o llamar a algunas funciones de utilidad proporcionadas por los SDKs de Casdoor para obtener las URLs:
1. Concatenando cadenas manualmente
- URL de la página de registro
- Registro para la aplicación especificada:
<your-casdoor-hostname>/signup/<your-application-name>
- Registro por 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
- Registro automático:
<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
- Registro para la aplicación especificada:
- URL de la página de inicio de sesión
- Inicio de sesión para la organización especificada:
<your-casdoor-hostname>/login/<your-organization-name>
- Inicio de sesión por 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
- Inicio de sesión para la organización especificada:
2. Usando SDK frontend (para código JavaScript frontend usando React, Vue o Angular)
getSignupUrl()
y getSigninUrl()
: casdoor-js-sdk
3. Usando SDK backend (para código backend usando Go, Java, etc.)
GetSignupUrl()
y GetSigninUrl()
: casdoor-go-sdk
Proveedor
Casdoor es un sistema de inicio de sesión único federado que admite múltiples proveedores de identidad a través de OIDC, OAuth y SAML. Casdoor también puede enviar códigos de verificación u otras notificaciones a los usuarios a través de correo electrónico o SMS. Casdoor utiliza el concepto de Provider
para gestionar todos estos conectores de terceros.
Una lista de todos los proveedores soportados por Casdoor se puede encontrar en 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"`
}
¿Cómo se gestiona Casdoor a sí mismo?
Al ejecutar Casdoor por primera vez, se crean algunos objetos integrados para facilitar su gestión:
- Una organización integrada llamada
built-in
. - Un usuario llamado
admin
en la organizaciónbuilt-in
. - Una aplicación integrada llamada
app-built-in
, administrada por la organizaciónbuilt-in
, que representa a Casdoor en sí.
Todos los usuarios bajo la organización built-in
, incluyendo admin
, tendrán plenos privilegios de administrador en la plataforma Casdoor. Por lo tanto, si hay varios administradores, es aconsejable crear nuevas cuentas bajo la organización built-in
. Alternativamente, el canal de registro para la aplicación app-built-in
debe cerrarse para prevenir accesos no deseados.
No es posible renombrar o eliminar los objetos integrados a través de la interfaz web o la API RESTful. Casdoor ha codificado estos nombres reservados en muchos lugares; intentar renombrarlos o eliminarlos modificando la DB puede causar que todo el sistema se caiga.