핵심 개념
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"`
}
The Properties field is a flexible key-value map for storing custom user attributes. See the User Properties documentation for detailed usage examples and best practices.
응용 프로그램
애플리케이션은 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를 수정하여 이들을 이름 변경하거나 삭제하려고 시도하면 전체 시스템이 다운될 수 있습니다.