From 0bbdb27f6db4f9d08445ca02abae9061c81598b8 Mon Sep 17 00:00:00 2001 From: QiuSW <105186638@qq.com> Date: Sat, 15 Aug 2026 18:02:10 +0800 Subject: [PATCH 1/4] =?UTF-8?q?fix:=20=E6=81=A2=E5=A4=8D=20Sense=20?= =?UTF-8?q?=E5=85=8D=E9=AA=8C=E8=AF=81=E7=A0=81=E7=99=BB=E5=BD=95=20(#97)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/common/middleware/handler/auth.go | 12 +-- .../server/common/middleware/handler/login.go | 2 - .../common/middleware/handler/login_test.go | 35 ++++++++ Sense/server/docs/admin/admin_docs.go | 10 +-- Sense/server/docs/admin/admin_swagger.json | 12 +-- Sense/server/docs/admin/admin_swagger.yaml | 6 -- Sense/ui/src/views/login/index.vue | 89 +------------------ Sense/ui/tests/unit/login/loginPage.spec.js | 15 ++++ 8 files changed, 58 insertions(+), 123 deletions(-) create mode 100644 Sense/server/common/middleware/handler/login_test.go create mode 100644 Sense/ui/tests/unit/login/loginPage.spec.js diff --git a/Sense/server/common/middleware/handler/auth.go b/Sense/server/common/middleware/handler/auth.go index c5e3020..c6651ae 100644 --- a/Sense/server/common/middleware/handler/auth.go +++ b/Sense/server/common/middleware/handler/auth.go @@ -7,9 +7,7 @@ import ( "github.com/gin-gonic/gin" "github.com/go-admin-team/go-admin-core/sdk/api" - "github.com/go-admin-team/go-admin-core/sdk/config" "github.com/go-admin-team/go-admin-core/sdk/pkg" - "github.com/go-admin-team/go-admin-core/sdk/pkg/captcha" jwt "github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth" "github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth/user" "github.com/go-admin-team/go-admin-core/sdk/pkg/response" @@ -82,21 +80,13 @@ func Authenticator(c *gin.Context) (interface{}, error) { return nil, jwt.ErrMissingLoginValues } - if config.ApplicationConfig.Mode != "dev" { - if !captcha.Verify(loginVals.UUID, loginVals.Code, true) { - username = loginVals.Username - msg = "验证码错误" - status = "1" - - return nil, jwt.ErrInvalidVerificationode - } - } sysUser, role, e := loginVals.GetUser(db) if e == nil { username = loginVals.Username return map[string]interface{}{"user": sysUser, "role": role}, nil } else { + username = loginVals.Username msg = "登录失败" status = "1" log.Warnf("%s login failed!", loginVals.Username) diff --git a/Sense/server/common/middleware/handler/login.go b/Sense/server/common/middleware/handler/login.go index d17626c..3358b43 100644 --- a/Sense/server/common/middleware/handler/login.go +++ b/Sense/server/common/middleware/handler/login.go @@ -9,8 +9,6 @@ import ( type Login struct { Username string `form:"UserName" json:"username" binding:"required"` Password string `form:"Password" json:"password" binding:"required"` - Code string `form:"Code" json:"code" binding:"required"` - UUID string `form:"UUID" json:"uuid" binding:"required"` } func (u *Login) GetUser(tx *gorm.DB) (user SysUser, role SysRole, err error) { diff --git a/Sense/server/common/middleware/handler/login_test.go b/Sense/server/common/middleware/handler/login_test.go new file mode 100644 index 0000000..74df91b --- /dev/null +++ b/Sense/server/common/middleware/handler/login_test.go @@ -0,0 +1,35 @@ +package handler + +import ( + "net/http/httptest" + "reflect" + "strings" + "testing" + + "github.com/gin-gonic/gin" +) + +func TestLoginAcceptsCredentialsWithoutCaptcha(t *testing.T) { + gin.SetMode(gin.TestMode) + ctx, _ := gin.CreateTestContext(httptest.NewRecorder()) + ctx.Request = httptest.NewRequest("POST", "/api/v1/login", strings.NewReader(`{"username":"operator","password":"valid-password"}`)) + ctx.Request.Header.Set("Content-Type", "application/json") + + var login Login + if err := ctx.ShouldBindJSON(&login); err != nil { + t.Fatalf("bind credentials-only login: %v", err) + } + if login.Username != "operator" || login.Password != "valid-password" { + t.Fatalf("unexpected login payload: username=%q", login.Username) + } + + typeOfLogin := reflect.TypeOf(login) + if typeOfLogin.NumField() != 2 { + t.Fatalf("login payload must only expose username and password, got %d fields", typeOfLogin.NumField()) + } + for _, removed := range []string{"Code", "UUID"} { + if _, ok := typeOfLogin.FieldByName(removed); ok { + t.Fatalf("captcha field %s must not be part of the login payload", removed) + } + } +} diff --git a/Sense/server/docs/admin/admin_docs.go b/Sense/server/docs/admin/admin_docs.go index 688aa87..52d021e 100644 --- a/Sense/server/docs/admin/admin_docs.go +++ b/Sense/server/docs/admin/admin_docs.go @@ -3798,23 +3798,15 @@ const docTemplateadmin = `{ "handler.Login": { "type": "object", "required": [ - "code", "password", - "username", - "uuid" + "username" ], "properties": { - "code": { - "type": "string" - }, "password": { "type": "string" }, "username": { "type": "string" - }, - "uuid": { - "type": "string" } } }, diff --git a/Sense/server/docs/admin/admin_swagger.json b/Sense/server/docs/admin/admin_swagger.json index d3c32a1..db98d35 100644 --- a/Sense/server/docs/admin/admin_swagger.json +++ b/Sense/server/docs/admin/admin_swagger.json @@ -3789,23 +3789,15 @@ "handler.Login": { "type": "object", "required": [ - "code", "password", - "username", - "uuid" + "username" ], "properties": { - "code": { - "type": "string" - }, "password": { "type": "string" }, "username": { "type": "string" - }, - "uuid": { - "type": "string" } } }, @@ -4345,4 +4337,4 @@ "in": "header" } } -} \ No newline at end of file +} diff --git a/Sense/server/docs/admin/admin_swagger.yaml b/Sense/server/docs/admin/admin_swagger.yaml index 412817e..2d92499 100644 --- a/Sense/server/docs/admin/admin_swagger.yaml +++ b/Sense/server/docs/admin/admin_swagger.yaml @@ -685,19 +685,13 @@ definitions: type: object handler.Login: properties: - code: - type: string password: type: string username: type: string - uuid: - type: string required: - - code - password - username - - uuid type: object models.SysApi: properties: diff --git a/Sense/ui/src/views/login/index.vue b/Sense/ui/src/views/login/index.vue index 259f19b..9c19c1c 100644 --- a/Sense/ui/src/views/login/index.vue +++ b/Sense/ui/src/views/login/index.vue @@ -102,29 +102,6 @@ - -
- -
- 验证码 -
- -
-
-
-
-