Conceitos Principais
Como administrador do Casdoor, você deve estar familiarizado com pelo menos quatro conceitos principais: Organização
, Usuário
, Aplicativo
e Fornecedor
.
Nas partes seguintes, usaremos o site de demonstração https://door.casdoor.com como exemplo.
Organização
No Casdoor, uma organização é um contêiner para usuários e aplicativos. Por exemplo, todos os funcionários de uma empresa ou todos os clientes de um negócio podem ser abstraídos como uma organização. A definição da classe Organização
é mostrada abaixo:
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"`
}
Usuário
No Casdoor, um usuário pode fazer login em um aplicativo. Cada usuário pode pertencer a apenas uma organização, mas pode fazer login em vários aplicativos pertencentes à organização. Atualmente, existem dois tipos de usuários no Casdoor:
- usuários da organização
built-in
, comobuilt-in/admin
: administradores globais que têm poder administrativo total na plataforma Casdoor. - Usuários de outras organizações, como
my-company/alice
: usuários normais que podem se inscrever, fazer login, sair, alterar seu próprio perfil, etc.
Na API do Casdoor, um usuário é tipicamente identificado como <organization_name>/<username>
. Por exemplo, o administrador padrão do Casdoor é denotado como built-in/admin
. Além disso, a definição da classe Usuário
inclui uma propriedade id
, que é um UUID como d835a48f-2e88-4c1f-b907-60ac6b6c1b40
e pode ser escolhido como ID de um usuário por um aplicativo.
Para aplicativos que são apenas para uma organização, é possível usar <username>
em vez de <organization_name>/<username>
como o ID do usuário em todo o aplicativo para simplicidade.
Aqui está a definição da classe Usuário
:
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"`
}
Aplicativo
Um aplicativo representa um serviço web que precisa ser protegido pelo Casdoor, como um site de fórum, um sistema OA ou um 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 aplicativo pode ter sua própria página de inscrição personalizada, página de login e mais. A página de login raiz /login
(por exemplo, https://door.casdoor.com/login) é a página de login apenas para o aplicativo interno do Casdoor: app-built-in
.
Um aplicativo é um "portal" ou "interface" para um usuário fazer login no Casdoor. Um usuário deve passar pela página de login de um aplicativo para fazer login no Casdoor.
URLs de Login
É muito fácil fazer login no Casdoor através do aplicativo interno do Casdoor; basta visitar a página inicial do servidor Casdoor (por exemplo, https://door.casdoor.com para o site de demonstração) e ele redirecionará automaticamente para /login
. Mas como você obtém as URLs para outros aplicativos no código frontend e backend? Você pode concatenar strings manualmente ou chamar algumas funções utilitárias fornecidas pelos SDKs do Casdoor para obter as URLs:
1. Concatenando strings manualmente
- URL da página de inscrição
- Inscrição para o aplicativo especificado:
<your-casdoor-hostname>/signup/<your-application-name>
- Inscrição 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
- Inscrição automática:
<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
- Inscrição para o aplicativo especificado:
- URL da página de login
- Login para a organização especificada:
<your-casdoor-hostname>/login/<your-organization-name>
- Login 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
- Login para a organização especificada:
2. Usando SDK frontend (para código JavaScript frontend usando React, Vue ou Angular)
getSignupUrl()
e getSigninUrl()
: casdoor-js-sdk
3. Usando SDK backend (para código backend usando Go, Java, etc.)
GetSignupUrl()
e GetSigninUrl()
: casdoor-go-sdk
Fornecedor
Casdoor é um sistema de login único federado que suporta vários provedores de identidade via OIDC, OAuth e SAML. Casdoor também pode enviar códigos de verificação ou outras notificações para usuários via e-mail ou SMS. Casdoor usa o conceito de Fornecedor
para gerenciar todos esses conectores de terceiros.
Uma lista de todos os fornecedores suportados pelo Casdoor pode ser encontrada em fornecedor/visão geral.
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"`
}
Como o Casdoor gerencia a si mesmo?
Ao executar o Casdoor pela primeira vez, alguns objetos internos são criados para facilitar sua gestão:
- Uma organização interna chamada
built-in
. - Um usuário chamado
admin
na organizaçãobuilt-in
. - Um aplicativo interno chamado
app-built-in
, administrado pela organizaçãobuilt-in
, representando o próprio Casdoor.
Todos os usuários sob a organização built-in
, incluindo admin
, terão privilégios de administrador total na plataforma Casdoor. Portanto, se houver vários administradores, é aconselhável criar novas contas sob a organização built-in
. Alternativamente, o canal de inscrição para o aplicativo app-built-in
deve ser fechado para evitar acessos indesejados.
Não é possível renomear ou excluir os objetos internos tanto pela interface de usuário web quanto pela API RESTful. Casdoor tem esses nomes reservados codificados em muitos lugares; tentar renomeá-los ou excluí-los modificando o DB pode causar a falha de todo o sistema.