瀏覽代碼

Extract login logic from Verify. Also try an implicit login in /login/index -- to skip the login window if web_username/password is empty.

caiych 4 年之前
父節點
當前提交
e2d85edbfb
共有 1 個文件被更改,包括 31 次插入17 次删除
  1. 31 17
      web/controllers/login.go

+ 31 - 17
web/controllers/login.go

@@ -24,11 +24,28 @@ type record struct {
 }
 
 func (self *LoginController) Index() {
-	self.Data["web_base_url"] = beego.AppConfig.String("web_base_url")
+	// Try login implicitly, will succeed if it's configured as no-auth(empty username&password).
+	webBaseUrl := beego.AppConfig.String("web_base_url")
+	if self.doLogin("", "", false) {
+		self.Redirect(webBaseUrl+"/index/index", 302)
+	}
+	self.Data["web_base_url"] = webBaseUrl
 	self.Data["register_allow"], _ = beego.AppConfig.Bool("allow_user_register")
 	self.TplName = "login/index.html"
 }
+
 func (self *LoginController) Verify() {
+	username := self.GetString("username")
+	password := self.GetString("password")
+	if self.doLogin(username, password, true) {
+		self.Data["json"] = map[string]interface{}{"status": 1, "msg": "login success"}
+	} else {
+		self.Data["json"] = map[string]interface{}{"status": 0, "msg": "username or password incorrect"}
+	}
+	self.ServeJSON()
+}
+
+func (self *LoginController) doLogin(username, password string, explicit bool) bool {
 	clearIprecord()
 	ip, _, _ := net.SplitHostPort(self.Ctx.Request.RemoteAddr)
 	if v, ok := ipRecord.Load(ip); ok {
@@ -37,13 +54,11 @@ func (self *LoginController) Verify() {
 			vv.hasLoginFailTimes = 0
 		}
 		if vv.hasLoginFailTimes >= 10 {
-			self.Data["json"] = map[string]interface{}{"status": 0, "msg": "username or password incorrect"}
-			self.ServeJSON()
-			return
+			return false
 		}
 	}
 	var auth bool
-	if self.GetString("password") == beego.AppConfig.String("web_password") && self.GetString("username") == beego.AppConfig.String("web_username") {
+	if password == beego.AppConfig.String("web_password") && username == beego.AppConfig.String("web_username") {
 		self.SetSession("isAdmin", true)
 		self.DelSession("clientId")
 		self.DelSession("username")
@@ -58,13 +73,13 @@ func (self *LoginController) Verify() {
 				return true
 			}
 			if v.WebUserName == "" && v.WebPassword == "" {
-				if self.GetString("username") != "user" || v.VerifyKey != self.GetString("password") {
+				if username != "user" || v.VerifyKey != password {
 					return true
 				} else {
 					auth = true
 				}
 			}
-			if !auth && v.WebPassword == self.GetString("password") && self.GetString("username") == v.WebUserName {
+			if !auth && v.WebPassword == password && v.WebUserName == username {
 				auth = true
 			}
 			if auth {
@@ -78,18 +93,17 @@ func (self *LoginController) Verify() {
 	}
 	if auth {
 		self.SetSession("auth", true)
-		self.Data["json"] = map[string]interface{}{"status": 1, "msg": "login success"}
 		ipRecord.Delete(ip)
-	} else {
-		if v, load := ipRecord.LoadOrStore(ip, &record{hasLoginFailTimes: 1, lastLoginTime: time.Now()}); load {
-			vv := v.(*record)
-			vv.lastLoginTime = time.Now()
-			vv.hasLoginFailTimes += 1
-			ipRecord.Store(ip, vv)
-		}
-		self.Data["json"] = map[string]interface{}{"status": 0, "msg": "username or password incorrect"}
+		return true
+
 	}
-	self.ServeJSON()
+	if v, load := ipRecord.LoadOrStore(ip, &record{hasLoginFailTimes: 1, lastLoginTime: time.Now()}); load && explicit {
+		vv := v.(*record)
+		vv.lastLoginTime = time.Now()
+		vv.hasLoginFailTimes += 1
+		ipRecord.Store(ip, vv)
+	}
+	return false
 }
 func (self *LoginController) Register() {
 	if self.Ctx.Request.Method == "GET" {