feat: add response to Records page (#2830)

* feat: add response to Records page

* feat: improve AddRecord

* feat: remove log and return err

* feat: improve record in signup and record deny

* fix: filter will generate 403 record correctly
This commit is contained in:
DacongDA 2024-03-22 14:53:38 +08:00 committed by GitHub
parent 97cc1f9e2b
commit 23dbb0b926
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
30 changed files with 117 additions and 59 deletions

View File

@ -271,10 +271,7 @@ func (c *ApiController) Signup() {
return
}
record := object.NewRecord(c.Ctx)
record.Organization = application.Organization
record.User = user.Name
util.SafeGoroutine(func() { object.AddRecord(record) })
c.Ctx.Input.SetParam("recordUserId", fmt.Sprintf("%s/%s", application.Organization, user.Name))
userId := user.GetId()
util.LogInfo(c.Ctx, "API: [%s] is signed up as new user", userId)

View File

@ -508,10 +508,7 @@ func (c *ApiController) Login() {
resp = c.HandleLoggedIn(application, user, &authForm)
record := object.NewRecord(c.Ctx)
record.Organization = application.Organization
record.User = user.Name
util.SafeGoroutine(func() { object.AddRecord(record) })
c.Ctx.Input.SetParam("recordUserId", user.GetId())
}
} else if authForm.Provider != "" {
var application *object.Application
@ -632,10 +629,7 @@ func (c *ApiController) Login() {
}
resp = c.HandleLoggedIn(application, user, &authForm)
record := object.NewRecord(c.Ctx)
record.Organization = application.Organization
record.User = user.Name
util.SafeGoroutine(func() { object.AddRecord(record) })
c.Ctx.Input.SetParam("recordUserId", user.GetId())
} else if provider.Category == "OAuth" || provider.Category == "Web3" {
// Sign up via OAuth
if application.EnableLinkWithEmail {
@ -768,16 +762,8 @@ func (c *ApiController) Login() {
resp = c.HandleLoggedIn(application, user, &authForm)
record := object.NewRecord(c.Ctx)
record.Organization = application.Organization
record.User = user.Name
util.SafeGoroutine(func() { object.AddRecord(record) })
record2 := object.NewRecord(c.Ctx)
record2.Action = "signup"
record2.Organization = application.Organization
record2.User = user.Name
util.SafeGoroutine(func() { object.AddRecord(record2) })
c.Ctx.Input.SetParam("recordUserId", user.GetId())
c.Ctx.Input.SetParam("recordSignup", "true")
} else if provider.Category == "SAML" {
// TODO: since we get the user info from SAML response, we can try to create the user
resp = &Response{Status: "error", Msg: fmt.Sprintf(c.T("general:The user: %s doesn't exist"), util.GetId(application.Organization, userInfo.Id))}
@ -879,10 +865,7 @@ func (c *ApiController) Login() {
resp = c.HandleLoggedIn(application, user, &authForm)
c.setMfaUserSession("")
record := object.NewRecord(c.Ctx)
record.Organization = application.Organization
record.User = user.Name
util.SafeGoroutine(func() { object.AddRecord(record) })
c.Ctx.Input.SetParam("recordUserId", user.GetId())
} else {
if c.GetSessionUsername() != "" {
// user already signed in to Casdoor, so let the user click the avatar button to do the quick sign-in
@ -901,10 +884,7 @@ func (c *ApiController) Login() {
user := c.getCurrentUser()
resp = c.HandleLoggedIn(application, user, &authForm)
record := object.NewRecord(c.Ctx)
record.Organization = application.Organization
record.User = user.Name
util.SafeGoroutine(func() { object.AddRecord(record) })
c.Ctx.Input.SetParam("recordUserId", user.GetId())
} else {
c.ResponseError(fmt.Sprintf(c.T("auth:Unknown authentication type (not password or provider), form = %s"), util.StructToJson(authForm)))
return

View File

@ -59,6 +59,7 @@ func main() {
beego.InsertFilter("*", beego.BeforeRouter, routers.ApiFilter)
beego.InsertFilter("*", beego.BeforeRouter, routers.PrometheusFilter)
beego.InsertFilter("*", beego.BeforeRouter, routers.RecordMessage)
beego.InsertFilter("*", beego.AfterExec, routers.AfterRecordMessage, false)
beego.BConfig.WebConfig.Session.SessionOn = true
beego.BConfig.WebConfig.Session.SessionName = "casdoor_session_id"

View File

@ -15,6 +15,7 @@
package object
import (
"encoding/json"
"fmt"
"strings"
@ -34,7 +35,12 @@ type Record struct {
casvisorsdk.Record
}
func NewRecord(ctx *context.Context) *casvisorsdk.Record {
type Response struct {
Status string `json:"status"`
Msg string `json:"msg"`
}
func NewRecord(ctx *context.Context) (*casvisorsdk.Record, error) {
ip := strings.Replace(util.GetIPFromRequest(ctx.Request), ": ", "", -1)
action := strings.Replace(ctx.Request.URL.Path, "/api/", "", -1)
requestUri := util.FilterQuery(ctx.Request.RequestURI, []string{"accessToken"})
@ -47,6 +53,17 @@ func NewRecord(ctx *context.Context) *casvisorsdk.Record {
object = string(ctx.Input.RequestBody)
}
respBytes, err := json.Marshal(ctx.Input.Data()["json"])
if err != nil {
return nil, err
}
var resp Response
err = json.Unmarshal(respBytes, &resp)
if err != nil {
return nil, err
}
language := ctx.Request.Header.Get("Accept-Language")
if len(language) > 2 {
language = language[0:2]
@ -63,10 +80,10 @@ func NewRecord(ctx *context.Context) *casvisorsdk.Record {
Action: action,
Language: languageCode,
Object: object,
Response: "",
Response: fmt.Sprintf("{status:\"%s\", msg:\"%s\"}", resp.Status, resp.Msg),
IsTriggered: false,
}
return &record
return &record, nil
}
func AddRecord(record *casvisorsdk.Record) bool {

View File

@ -20,6 +20,8 @@ import (
"net/http"
"strings"
"github.com/casdoor/casdoor/object"
"github.com/beego/beego/context"
"github.com/casdoor/casdoor/authz"
"github.com/casdoor/casdoor/util"
@ -211,5 +213,17 @@ func ApiFilter(ctx *context.Context) {
if !isAllowed {
denyRequest(ctx)
record, err := object.NewRecord(ctx)
if err != nil {
return
}
record.Organization = subOwner
record.User = subName // auth:Unauthorized operation
record.Response = fmt.Sprintf("{status:\"error\", msg:\"%s\"}", T(ctx, "auth:Unauthorized operation"))
util.SafeGoroutine(func() {
object.AddRecord(record)
})
}
}

View File

@ -60,12 +60,30 @@ func RecordMessage(ctx *context.Context) {
return
}
record := object.NewRecord(ctx)
userId := getUser(ctx)
ctx.Input.SetParam("recordUserId", userId)
}
func AfterRecordMessage(ctx *context.Context) {
record, err := object.NewRecord(ctx)
if err != nil {
return
}
userId := ctx.Input.Params()["recordUserId"]
if userId != "" {
record.Organization, record.User = util.GetOwnerAndNameFromId(userId)
}
util.SafeGoroutine(func() { object.AddRecord(record) })
recordSignup := ctx.Input.Params()["recordSignup"]
if recordSignup == "true" {
record2 := *record
record2.Action = "signup"
util.SafeGoroutine(func() { object.AddRecord(&record2) })
}
util.SafeGoroutine(func() {
object.AddRecord(record)
})
}

View File

@ -151,6 +151,14 @@ class RecordListPage extends BaseListPage {
sorter: true,
...this.getColumnSearchProps("language"),
},
{
title: i18next.t("record:Response"),
dataIndex: "response",
key: "response",
width: "90px",
sorter: true,
...this.getColumnSearchProps("response"),
},
{
title: i18next.t("record:Object"),
dataIndex: "object",

View File

@ -892,7 +892,8 @@
},
"record": {
"Is triggered": "Is triggered",
"Object": "Object"
"Object": "Object",
"Response": "Response"
},
"resource": {
"Copy Link": "Copy Link",

View File

@ -892,7 +892,8 @@
},
"record": {
"Is triggered": "Is triggered",
"Object": "Object"
"Object": "Object",
"Response": "Response"
},
"resource": {
"Copy Link": "Kopiere den Link",

View File

@ -892,7 +892,8 @@
},
"record": {
"Is triggered": "Is triggered",
"Object": "Object"
"Object": "Object",
"Response": "Response"
},
"resource": {
"Copy Link": "Copy Link",

View File

@ -892,7 +892,8 @@
},
"record": {
"Is triggered": "Is triggered",
"Object": "Object"
"Object": "Object",
"Response": "Response"
},
"resource": {
"Copy Link": "Copiar enlace",

View File

@ -892,7 +892,8 @@
},
"record": {
"Is triggered": "Is triggered",
"Object": "Object"
"Object": "Object",
"Response": "Response"
},
"resource": {
"Copy Link": "Copy Link",

View File

@ -892,7 +892,8 @@
},
"record": {
"Is triggered": "Is triggered",
"Object": "Object"
"Object": "Object",
"Response": "Response"
},
"resource": {
"Copy Link": "Copy Link",

View File

@ -892,7 +892,8 @@
},
"record": {
"Is triggered": "Is triggered",
"Object": "Object"
"Object": "Object",
"Response": "Response"
},
"resource": {
"Copy Link": "Copier le lien",

View File

@ -892,7 +892,8 @@
},
"record": {
"Is triggered": "Is triggered",
"Object": "Object"
"Object": "Object",
"Response": "Response"
},
"resource": {
"Copy Link": "Copy Link",

View File

@ -892,7 +892,8 @@
},
"record": {
"Is triggered": "Is triggered",
"Object": "Object"
"Object": "Object",
"Response": "Response"
},
"resource": {
"Copy Link": "Salin Tautan",

View File

@ -892,7 +892,8 @@
},
"record": {
"Is triggered": "Is triggered",
"Object": "Object"
"Object": "Object",
"Response": "Response"
},
"resource": {
"Copy Link": "Copy Link",

View File

@ -892,7 +892,8 @@
},
"record": {
"Is triggered": "Is triggered",
"Object": "Object"
"Object": "Object",
"Response": "Response"
},
"resource": {
"Copy Link": "コピー リンク",

View File

@ -892,7 +892,8 @@
},
"record": {
"Is triggered": "Is triggered",
"Object": "Object"
"Object": "Object",
"Response": "Response"
},
"resource": {
"Copy Link": "Copy Link",

View File

@ -892,7 +892,8 @@
},
"record": {
"Is triggered": "Is triggered",
"Object": "Object"
"Object": "Object",
"Response": "Response"
},
"resource": {
"Copy Link": "링크 복사하기",

View File

@ -892,7 +892,8 @@
},
"record": {
"Is triggered": "Is triggered",
"Object": "Object"
"Object": "Object",
"Response": "Response"
},
"resource": {
"Copy Link": "Copy Link",

View File

@ -892,7 +892,8 @@
},
"record": {
"Is triggered": "Is triggered",
"Object": "Object"
"Object": "Object",
"Response": "Response"
},
"resource": {
"Copy Link": "Copy Link",

View File

@ -892,7 +892,8 @@
},
"record": {
"Is triggered": "Is triggered",
"Object": "Object"
"Object": "Object",
"Response": "Response"
},
"resource": {
"Copy Link": "Copy Link",

View File

@ -892,7 +892,8 @@
},
"record": {
"Is triggered": "Is triggered",
"Object": "Object"
"Object": "Object",
"Response": "Response"
},
"resource": {
"Copy Link": "Copiar Link",

View File

@ -892,7 +892,8 @@
},
"record": {
"Is triggered": "Is triggered",
"Object": "Object"
"Object": "Object",
"Response": "Response"
},
"resource": {
"Copy Link": "Копировать ссылку",

View File

@ -892,7 +892,8 @@
},
"record": {
"Is triggered": "Is triggered",
"Object": "Object"
"Object": "Object",
"Response": "Response"
},
"resource": {
"Copy Link": "Copy Link",

View File

@ -892,7 +892,8 @@
},
"record": {
"Is triggered": "Is triggered",
"Object": "Object"
"Object": "Object",
"Response": "Response"
},
"resource": {
"Copy Link": "Copy Link",

View File

@ -892,7 +892,8 @@
},
"record": {
"Is triggered": "Is triggered",
"Object": "Object"
"Object": "Object",
"Response": "Response"
},
"resource": {
"Copy Link": "Copy Link",

View File

@ -892,7 +892,8 @@
},
"record": {
"Is triggered": "Is triggered",
"Object": "Object"
"Object": "Object",
"Response": "Response"
},
"resource": {
"Copy Link": "Sao chép liên kết",

View File

@ -892,7 +892,8 @@
},
"record": {
"Is triggered": "是否触发",
"Object": "实体"
"Object": "实体",
"Response": "响应"
},
"resource": {
"Copy Link": "复制链接",