Skip to content

Commit

Permalink
feat: integrate Storage config into providers (casdoor#198)
Browse files Browse the repository at this point in the history
Signed-off-by: Kininaru <[email protected]>
  • Loading branch information
keainye authored Jul 26, 2021
1 parent 1c01a34 commit 3d493b8
Show file tree
Hide file tree
Showing 12 changed files with 224 additions and 160 deletions.
15 changes: 0 additions & 15 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -144,18 +144,3 @@ Now, Casdoor is running on port 8000. You can access Casdoor pages directly in y
export const GithubRepo = "https://github.com/casbin/casdoor" //your github repository
```

- OSS conf

We use an OSS to store and provide user avatars. You must modify the file `conf/oss.conf` to tell the backend your OSS info. For OSS providers, we support Aliyun(`[aliyun]`), awss3(`[s3]`) now.

```
[provider]
accessId = id
accessKey = key
bucket = bucket
endpoint = endpoint
```

Please fill out this conf correctly, or the avatar server won't work!
6 changes: 0 additions & 6 deletions conf/oss.conf

This file was deleted.

6 changes: 4 additions & 2 deletions controllers/account.go
Original file line number Diff line number Diff line change
Expand Up @@ -237,6 +237,8 @@ func (c *ApiController) UploadAvatar() {
var resp Response

user := object.GetUser(userId)
application := object.GetApplicationByUser(user)
provider := application.GetStorageProvider()

avatarBase64 := c.Ctx.Request.Form.Get("avatarfile")
index := strings.Index(avatarBase64, ",")
Expand All @@ -248,14 +250,14 @@ func (c *ApiController) UploadAvatar() {
}

dist, _ := base64.StdEncoding.DecodeString(avatarBase64[index+1:])
msg := object.UploadAvatar(user.GetId(), dist)
msg := object.UploadAvatar(provider, user.GetId(), dist)
if msg != "" {
resp = Response{Status: "error", Msg: msg}
c.Data["json"] = resp
c.ServeJSON()
return
}
user.Avatar = fmt.Sprintf("%s%s.png?time=%s", object.GetAvatarPath(), user.GetId(), util.GetCurrentUnixTime())
user.Avatar = fmt.Sprintf("%s%s.png?time=%s", object.GetAvatarPath(provider), user.GetId(), util.GetCurrentUnixTime())
object.UpdateUser(user.GetId(), user)
resp = Response{Status: "ok", Msg: ""}
c.Data["json"] = resp
Expand Down
4 changes: 2 additions & 2 deletions controllers/auth.go
Original file line number Diff line number Diff line change
Expand Up @@ -264,7 +264,7 @@ func (c *ApiController) Login() {
//}

//if len(object.GetMemberAvatar(userId)) == 0 {
// avatar := UploadAvatarToOSS(res.Avatar, userId)
// avatar := UploadAvatarToStorage(res.Avatar, userId)
// object.LinkMemberAccount(userId, "avatar", avatar)
//}

Expand Down Expand Up @@ -357,7 +357,7 @@ func (c *ApiController) Login() {
resp = &Response{Status: "error", Msg: "Failed to link user account", Data: isLinked}
}
//if len(object.GetMemberAvatar(userId)) == 0 {
// avatar := UploadAvatarToOSS(tempUserAccount.AvatarUrl, userId)
// avatar := UploadAvatarToStorage(tempUserAccount.AvatarUrl, userId)
// object.LinkUserAccount(userId, "avatar", avatar)
//}
}
Expand Down
4 changes: 4 additions & 0 deletions object/application_item.go
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,10 @@ func (application *Application) GetSmsProvider() *Provider {
return application.getProviderByCategory("SMS")
}

func (application *Application) GetStorageProvider() *Provider {
return application.getProviderByCategory("Storage")
}

func (application *Application) getSignupItem(itemName string) *SignupItem {
for _, signupItem := range application.SignupItems {
if signupItem.Name == itemName {
Expand Down
130 changes: 0 additions & 130 deletions object/oss.go

This file was deleted.

10 changes: 10 additions & 0 deletions object/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@
package object

import (
"fmt"

"github.com/casbin/casdoor/util"
"xorm.io/core"
)
Expand All @@ -40,6 +42,10 @@ type Provider struct {
TemplateCode string `xorm:"varchar(100)" json:"templateCode"`
AppId string `xorm:"varchar(100)" json:"appId"`

Endpoint string `xorm:"varchar(100)" json:"endpoint"`
Domain string `xorm:"varchar(100)" json:"domain"`
Bucket string `xorm:"varchar(100)" json:"bucket"`

ProviderUrl string `xorm:"varchar(200)" json:"providerUrl"`
}

Expand Down Expand Up @@ -134,3 +140,7 @@ func DeleteProvider(provider *Provider) bool {

return affected != 0
}

func (p *Provider) GetId() string {
return fmt.Sprintf("%s/%s", p.Owner, p.Name)
}
136 changes: 136 additions & 0 deletions object/storage.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,136 @@
// Copyright 2021 The casbin Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package object

import (
"bytes"
"fmt"

awss3 "github.com/aws/aws-sdk-go/service/s3"
"github.com/casbin/casdoor/util"
"github.com/qor/oss"
"github.com/qor/oss/aliyun"
//"github.com/qor/oss/qiniu"
"github.com/qor/oss/s3"
)

func getAliyunClient(provider *Provider) oss.StorageInterface {
if util.IsStrsEmpty(
provider.Endpoint,
provider.ClientId,
provider.ClientSecret,
provider.Bucket) {
return nil
}

ret := aliyun.New(&aliyun.Config{
AccessID: provider.ClientId,
AccessKey: provider.ClientSecret,
Bucket: provider.Bucket,
Endpoint: provider.Endpoint,
})

if len(provider.Domain) == 0 {
provider.Domain = ret.GetEndpoint()
UpdateProvider(provider.GetId(), provider)
}
return ret
}

func getQiniuClient(provider *Provider) oss.StorageInterface {
fmt.Println("Casdoor does not support Qiniu now.")
return nil
// endpoint := section.Key("endpoint").String()
// accessId := section.Key("accessId").String()
// accessKey := section.Key("accessKey").String()
// domain = section.Key("domain").String()
// bucket := section.Key("bucket").String()
// region := section.Key("region").String()
// if accessId == "" || accessKey == "" || bucket == "" || endpoint == "" || region == "" {
// return "Config oss.conf wrong"
// }
// storage = qiniu.New(&qiniu.Config{
// AccessID: accessId,
// AccessKey: accessKey,
// Bucket: bucket,
// Region: region,
// Endpoint: endpoint,
// })
// return ""
}

func getAwss3Client(provider *Provider) oss.StorageInterface {
if util.IsStrsEmpty(
provider.Endpoint,
provider.ClientId,
provider.ClientSecret,
provider.Bucket,
provider.RegionId) {
return nil
}

ret := s3.New(&s3.Config{
AccessID: provider.ClientId,
AccessKey: provider.ClientSecret,
Region: provider.RegionId,
Bucket: provider.Bucket,
Endpoint: provider.Endpoint,
ACL: awss3.BucketCannedACLPublicRead,
})

if len(provider.Domain) == 0 {
provider.Domain = ret.GetEndpoint()
UpdateProvider(provider.GetId(), provider)
}
return ret
}

func getStorageClient(provider *Provider) oss.StorageInterface {
if provider == nil || provider.Category != "Storage" {
return nil
}

switch provider.Type {
case "Aliyun":
return getAliyunClient(provider)
case "Qiniu":
return getQiniuClient(provider)
case "AWSS3":
return getAwss3Client(provider)
}

return nil
}

func UploadAvatar(provider *Provider, username string, avatar []byte) string {
if provider == nil {
return "invalid Storage provider"
}
storage := getStorageClient(provider)
if storage == nil {
return "oss provider not exists"
}

path := fmt.Sprintf("/casdoor/avatar/%s.png", username)
_, err := storage.Put(path, bytes.NewReader(avatar))
if err != nil {
panic(err)
}
return ""
}

func GetAvatarPath(provider *Provider) string {
return fmt.Sprintf("https://%s/casdoor/avatar/", provider.Domain)
}
5 changes: 2 additions & 3 deletions util/string.go
Original file line number Diff line number Diff line change
Expand Up @@ -57,13 +57,12 @@ func GetMd5Hash(text string) string {
}

func IsStrsEmpty(strs ...string) bool {
r := false
for _, str := range strs {
if len(str) == 0 {
r = true
return true
}
}
return r
return false
}

func GetMaxLenStr(strs ...string) string {
Expand Down
Loading

0 comments on commit 3d493b8

Please sign in to comment.