feat(cloudid): add azure saml

This commit is contained in:
Qu Xuan
2021-01-18 14:58:19 +08:00
parent be959d9459
commit 627503cdc1
37 changed files with 916 additions and 32 deletions
+43 -1
View File
@@ -557,6 +557,9 @@ func (self *SCloudaccount) GetCloudusers() ([]SClouduser, error) {
}
func (self *SCloudaccount) SyncCloudusers(ctx context.Context, userCred mcclient.TokenCredential, iUsers []cloudprovider.IClouduser) ([]SClouduser, []cloudprovider.IClouduser, compare.SyncResult) {
lockman.LockRawObject(ctx, "cloudusers", self.Id)
defer lockman.ReleaseRawObject(ctx, "cloudusers", self.Id)
result := compare.SyncResult{}
dbUsers, err := self.GetCloudusers()
if err != nil {
@@ -1147,7 +1150,10 @@ func (self *SCloudaccount) StartSAMLProviderCreateTask(ctx context.Context, user
}
return nil
}
return sp.StartSAMLProviderCreateTask(ctx, userCred, "")
if sp != nil {
return sp.StartSAMLProviderCreateTask(ctx, userCred, "")
}
return nil
}
func (manager *SCloudaccountManager) SyncSAMLProviders(ctx context.Context, userCred mcclient.TokenCredential, isStart bool) {
@@ -1805,3 +1811,39 @@ func (self *SCloudaccount) GetUserCloudgroups(userId string) ([]string, error) {
}
return ret, nil
}
func (self *SCloudaccount) InviteAzureUser(ctx context.Context, userCred mcclient.TokenCredential, domain string) (string, error) {
samlUsers, err := self.GetSamlusers()
if err != nil {
return "", errors.Wrapf(err, "GetSamlusers")
}
for i := range samlUsers {
if samlUsers[i].OwnerId == userCred.GetUserId() {
if len(samlUsers[i].Email) == 0 {
_, err := db.Update(&samlUsers[i], func() error {
samlUsers[i].Email = fmt.Sprintf("%s@%s", userCred.GetUserName(), domain)
return nil
})
if err != nil {
return "", errors.Wrapf(err, "db.Update")
}
}
provider, err := self.GetProvider()
if err != nil {
return "", errors.Wrapf(err, "self.GetProvider")
}
conf := cloudprovider.SClouduserCreateConfig{
Name: userCred.GetUserName(),
Email: samlUsers[i].Email,
UserType: "Guest",
}
iUser, err := provider.CreateIClouduser(&conf)
if err != nil {
return "", errors.Wrapf(err, "CreateIClouduser")
}
db.SetExternalId(&samlUsers[i], userCred, iUser.GetName())
return iUser.GetInviteUrl(), nil
}
}
return "", fmt.Errorf("not found any saml user for %s", userCred.GetUserName())
}
+1 -1
View File
@@ -38,7 +38,7 @@ type SCloudgroupResourceBase struct {
CloudgroupId string `width:"36" charset:"ascii" nullable:"false" list:"user" create:"required"`
}
func (self *SCloudgroupJointsBase) GetCloudgroup() (*SCloudgroup, error) {
func (self *SCloudgroupResourceBase) GetCloudgroup() (*SCloudgroup, error) {
group, err := CloudgroupManager.FetchById(self.CloudgroupId)
if err != nil {
return nil, errors.Wrap(err, "FetchById")
+43
View File
@@ -24,13 +24,17 @@ import (
api "yunion.io/x/onecloud/pkg/apis/cloudid"
"yunion.io/x/onecloud/pkg/cloudcommon/db"
"yunion.io/x/onecloud/pkg/cloudcommon/validators"
"yunion.io/x/onecloud/pkg/cloudid/options"
"yunion.io/x/onecloud/pkg/httperrors"
"yunion.io/x/onecloud/pkg/mcclient"
"yunion.io/x/onecloud/pkg/mcclient/auth"
"yunion.io/x/onecloud/pkg/util/stringutils2"
)
type SSamluserManager struct {
db.SStatusDomainLevelUserResourceBaseManager
db.SExternalizedResourceBaseManager
SCloudgroupResourceBaseManager
SCloudaccountResourceBaseManager
}
@@ -51,8 +55,12 @@ func init() {
type SSamluser struct {
db.SStatusDomainLevelUserResourceBase
db.SExternalizedResourceBase
SCloudgroupResourceBase
SCloudaccountResourceBase
// 邮箱地址
Email string `width:"36" charset:"ascii" nullable:"true" list:"user" create:"domain_optional"`
}
func (manager *SSamluserManager) GetResourceCount() ([]db.SScopeResourceCount, error) {
@@ -173,3 +181,38 @@ func (manager *SSamluserManager) FetchCustomizeColumns(
}
return rows
}
func (self *SSamluser) SyncAzureGroup() error {
group, err := self.GetCloudgroup()
if err != nil {
return errors.Wrapf(err, "GetCloudgroup")
}
account, err := self.GetCloudaccount()
if err != nil {
return errors.Wrapf(err, "GetCloudaccount")
}
cache, err := CloudgroupcacheManager.Register(group, account)
if err != nil {
return errors.Wrapf(err, "group cache Register")
}
if len(cache.ExternalId) == 0 {
s := auth.GetAdminSession(context.TODO(), options.Options.Region, "")
_, err = cache.GetOrCreateICloudgroup(context.TODO(), s.GetToken())
if err != nil {
return errors.Wrapf(err, "GetOrCreateICloudgroup")
}
cache, err = CloudgroupcacheManager.Register(group, account)
if err != nil {
return errors.Wrapf(err, "group cache Register")
}
}
iGroup, err := cache.GetICloudgroup()
if err != nil {
return errors.Wrapf(err, "GetICloudgroup")
}
err = iGroup.AddUser(self.ExternalId)
if err != nil {
return errors.Wrapf(err, "iGroup.AddUser")
}
return nil
}