tangs 7 роки тому
батько
коміт
f338725ece

+ 3 - 4
src/ddpf/login/login.go

@@ -6,7 +6,6 @@ import (
 	"github.com/tangs-drm/go-tool/log"
 	"github.com/tangs-drm/go-tool/util"
 	"ddpf/model/user"
-	"ddpf/model/session"
 )
 
 func Login(w http.ResponseWriter, r *http.Request) {
@@ -45,15 +44,15 @@ func Login(w http.ResponseWriter, r *http.Request) {
 	}
 
 	// check user password
-	var isCorrect bool
-	isCorrect, err = user.CheckPassword(username, password)
+	var usr *user.User
+	usr, err = user.CheckPassword(username, password)
 	if err != nil {
 		log.Error("Login receive username(%v) check password error ->(%v)", username, err)
 		code = 4
 		msg = "系统错误"
 		return
 	}
-	if !isCorrect {
+	if nil == usr {
 		log.Debug("Login receive username(%v) password is incorrect", username)
 		code = 5
 		msg = "密码错误"

+ 12 - 3
src/ddpf/login/session.go

@@ -13,9 +13,10 @@ type Filter struct {
 	FilterMap map[string]FilterFunc
 }
 
-func NewFilter() {
+func NewFilter() *Filter {
 	filter := &Filter{}
 	filter.DefaultFilter()
+	return filter
 }
 
 func (ft *Filter) ServeHTTP(w http.ResponseWriter, r *http.Request) {
@@ -23,7 +24,15 @@ func (ft *Filter) ServeHTTP(w http.ResponseWriter, r *http.Request) {
 	if err != nil || cookie == nil {
 		cookie = &http.Cookie{}
 	}
+	log.Debug("ServerHTTP ---- ")
+	// 过滤器
 	path  := r.URL.Path
+	ff := ft.getFilterFunc(path)
+	if nil == ff {
+		return
+	}
+
+
 
 	return
 }
@@ -37,7 +46,7 @@ func (ft *Filter) getFilterFunc(path string) FilterFunc {
 	return nil
 }
 
-func (ft *Filter) Filter(router string, FilterFunc) {
+func (ft *Filter) Filter(router string, ff FilterFunc) {
 }
 
 func (ft *Filter) Print() {
@@ -48,7 +57,7 @@ func (ft *Filter) Print() {
 }
 
 func (ft *Filter) DefaultFilter() {
-	var usrFilter FilterFunc = func() error {
+	var usrFilter FilterFunc = func(args util.Map) error {
 		return nil
 	}
 	ft.Filter("/usr", usrFilter)

+ 80 - 1
src/ddpf/model/session/session.go

@@ -4,12 +4,60 @@ import (
 	"ddpf/model/dbm"
 	"github.com/tangs-drm/go-tool/util"
 	"github.com/tangs-drm/go-tool/log"
+	thttp "github.com/tangs-drm/go-tool/http"
+	"net/http"
 )
 
 var ShowLog bool
 
 var Max_Session_Num = 10
-var Valid_Session_Time = 2592000000 // 一个月
+var Valid_Session_Time int64 = 2592000000 // 一个月
+
+var SessionLog bool
+
+func slog(format string, args... interface{}) {
+	if SessionLog {
+		log.LogD_(2, format, args...)
+	}
+}
+
+// UserFilterFunc过滤器,检查用户是否是登录状态
+var UserFilterFunc thttp.FilterFunc = func(w http.ResponseWriter, r *http.Request) int {
+	cookie, err := r.Cookie("token")
+	if err != nil {
+		slog("[UserFilterFunc] get cookie token error ->(%v)", err)
+		http.Redirect(w, r, "/", 301)
+		return thttp.REQUEST_RETURN
+	}
+	token := cookie.String()
+	// token 是36位的UUID,形如4C2FB50E-C530-7868-01DF-165B2BC47308
+	if len(token) != 36 {
+		slog("[UserFilterFunc] get empty token")
+		http.Redirect(w, r, "/", 301)
+		return thttp.REQUEST_RETURN
+	}
+
+	// 检查token是否合法
+	valid, err := CheckToken(token)
+	if err != nil {
+		slog("[UserFilterFunc] check token(%v) error -> (%v)", token, err)
+		http.Redirect(w, r, "/", 301)
+		return thttp.REQUEST_RETURN
+	}
+
+	if !valid {
+		slog("[UserFilterFunc] check token(%v) is invalid(%v)", token)
+		http.Redirect(w, r, "/", 301)
+		return thttp.REQUEST_RETURN
+	}
+
+	err = FlushToken(token)
+	if err != nil {
+		slog("[UserFilterFunc] flush token with token(%v) error ->(%v)", token, err)
+	}
+
+	return thttp.REQUEST_CONTINUE
+}
 
 // CreateSession create user session
 // 没有uid最多同时5个地方登陆
@@ -68,4 +116,35 @@ func CheckValidSession(session string) (bool, error) {
 		return false, nil
 	}
 	return true, nil
+}
+
+// CheckToken 检查用户的session是否有效
+// 返回值1 false: 无效, true: 有效
+// 返回值2 是否有错误信息,如有错误,返回err,否则返回nil
+func CheckToken(session string) (bool, error) {
+	var sqlString = "SELECT * FROM SESSION WHERE TOKEN = ?"
+	rows, err := dbm.Db().Query(sqlString, session)
+	if err != nil {
+		log.Error("[CheckToken] check session(%v) error ->(%v)", session, err)
+		return false, err
+	}
+	defer rows.Close()
+	if !rows.Next() {
+		return false, nil
+	}
+
+	return true, nil
+}
+
+// FlushToken更新session对应的最后一个登录时间
+func FlushToken(session string) error {
+	var sqlString = "UPDATE SESSION SET LASTTIME = ? WHERE ID = ?"
+	stmt, err := dbm.Db().Prepare(sqlString)
+	if err != nil {
+		return err
+	}
+	defer stmt.Close()
+
+	_, err = stmt.Exec(util.Now(), session)
+	return err
 }

+ 9 - 2
src/ddpf/model/user/login.go

@@ -38,5 +38,12 @@ func CheckPassword(account, password string) (*User, error) {
 	if !rows.Next() {
 		return nil, nil
 	}
-	return true, nil
-}
+	var user = &User{}
+	err = rows.Scan(&user.Id)
+	if err != nil {
+		log.Error("CheckPassword check account(%v) scan value error ->(%v)", account, err)
+		return nil, err
+	}
+	return user, nil
+}
+

+ 1 - 1
src/ddpf/response/items.go

@@ -2,7 +2,7 @@ package response
 
 import (
 	"net/http"
-	"github.com/Tangmz/go-tool/util"
+	"github.com/tangs-drm/go-tool/util"
 )
 
 type Response struct {

+ 1 - 1
src/github.com/tangs-drm/go-tool

@@ -1 +1 @@
-Subproject commit 07fa5378f3aeb70d41e12dc79ebe9da34ced36da
+Subproject commit da570539d081f8fd5616cab078a01bdecc6b5642

+ 15 - 3
src/main.go

@@ -2,20 +2,24 @@ package main
 
 import (
 	"net/http"
+	thttp "github.com/tangs-drm/go-tool/http"
 	"github.com/tangs-drm/go-tool/config"
 	"github.com/tangs-drm/go-tool/log"
 	"github.com/tangs-drm/go-tool/dbm"
 	_ "github.com/go-sql-driver/mysql"
 	"fmt"
+	"os"
+	"ddpf/model/session"
 )
 
 func main() {
 	var err error
 
 	// 初始化配置文件
-	var conf = "config.conf"
+	var conf = "src/config.conf"
 	var config = config.NewConfig()
 	err = config.Config(conf)
+	fmt.Println(os.Getwd())
 	if err != nil {
 		fmt.Println(err)
 		log.Error("main read config with conf(%v) error ->(%v)", conf, err)
@@ -33,8 +37,16 @@ func main() {
 	}
 	log.Debug("main init db success")
 
+	//filter := login.NewFilter()
+	mux := thttp.NewServerMux()
+
+	// 过滤器
+	mux.FilterFunc("/usr/", session.UserFilterFunc)
+
+	// 初始化http请求路由
+
 	var port = config.String("listen_port")
-	log.Debug("main start listen on port", port)
+	log.Debug("main start listen on port %v", port)
 
-	http.ListenAndServe(port, nil)
+	http.ListenAndServe(port, mux)
 }