핵심 개념
Casdoor 관리자로서, 적어도 네 가지 핵심 개념에 익숙해야 합니다: 조직
, 사용자
, 응용 프로그램
, 그리고 공급자
.
다음 부분에서는 데모 사이트 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 API에서 사용자는 일반적으로 <organization_name>/<username>
로 식별됩니다. 예를 들어, Casdoor의 기본 관리자는 built-in/admin
으로 표시됩니다. 또한, User
클래스 정의에는 id
속성이 포함되어 있으며, 이는 d835a48f-2e88-4c1f-b907-60ac6b6c1b40
와 같은 UUID이며 애플리케이션에서 사용자 ID로 선택될 수 있습니다.
하나의 조직만을 위한 애플리케이션의 경우, 간단하게 하기 위해 애플리케이션 전체에서 사용자 ID로 <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
으로 리디렉션됩니다. 그런데 프론트엔드와 백엔드 코드에서 다른 애플리케이션의 URL을 어떻게 얻을 수 있을까요? 문자열을 수동으로 연결하거나 Casdoor SDK에서 제공하는 몇 가지 유틸리티 함수를 호출하여 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 사용 (React, Vue, Angular를 사용하는 프론트엔드 JavaScript 코드용)
getSignupUrl()
과 getSigninUrl()
: casdoor-js-sdk
3. 백엔드 SDK 사용 (Go, Java 등을 사용하는 백엔드 코드용)
GetSignupUrl()
과 GetSigninUrl()
: casdoor-go-sdk
공급자
Casdoor는 OIDC, OAuth, SAML을 통해 여러 신원 제공자를 지원하는 연합 싱글 사인온 시스템입니다. Casdoor는 이메일이나 SMS를 통해 사용자에게 인증 코드나 기타 알림을 보낼 수도 있습니다. Casdoor는 이러한 제3자 커넥터를 모두 관리하기 위해 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
이라는 이름의 내장 조직.built-in
조직에 있는admin
이라는 이름의 사용자.- Casdoor 자체를 대표하는
built-in
조직에 의해 관리되는app-built-in
이라는 내장 애플리케이션.
built-in
조직 아래의 모든 사용자, admin
을 포함하여, Casdoor 플랫폼에서 전체 관리자 권한을 갖게 됩니다. 따라서, 관리자가 여러 명인 경우, built-in
조직 아래에 새 계정을 생성하는 것이 좋습니다. 또는, 원치 않는 접근을 방지하기 위해 app-built-in
애플리케이션의 가입 채널을 닫아야 합니다.
웹 UI 또는 RESTful API를 통해 내장 객체의 이름을 변경하거나 삭제하는 것은 불가능합니다. Casdoor는 이러한 예약된 이름을 여러 곳에 하드코딩하였으며, DB를 수정하여 이들을 이름 변경하거나 삭제하려고 시도하면 전체 시스템이 다운될 수 있습니다.