Преглед на файлове

添加登陆、验证登陆中间件、token存储

huangyh преди 6 години
родител
ревизия
cd361642a0

+ 102 - 40
controllers/SystemController.go

@@ -1,10 +1,16 @@
-
 package controllers
 
 import (
-	sysmodel "git.qianqiusoft.com/qianqiusoft/light-apiengine/models"
 	"fmt"
+	"strconv"
+	"strings"
+	"time"
+
+	"git.qianqiusoft.com/qianqiusoft/light-apiengine/entitys"
+	sysmodel "git.qianqiusoft.com/qianqiusoft/light-apiengine/models"
+	"git.qianqiusoft.com/qianqiusoft/light-apiengine/utils"
 )
+
 //https://www.kancloud.cn/xormplus/xorm/167077
 
 // _Login
@@ -19,13 +25,45 @@ func System_Login(c *SystemController) {
 	__none_func_system__(logininfo)
 	fmt.Println(logininfo)
 	var user sysmodel.SysUser
-	ret, err:=c.Db.SQL(sysmodel.SqlUserLogin, logininfo.Account).Get(&user)
-	if ret && err ==nil{
+	ret, err := c.Db.SQL(sysmodel.SqlUserLogin, logininfo.Account).Get(&user)
+	if ret && err == nil {
 		//TODO check password
+		timestamp := uint64(time.Now().UnixNano())
+		md5Pwd := utils.HashPassword(logininfo.Password, "")
+
+		//密码错误
+		if !strings.EqualFold(user.Password, md5Pwd) {
+			c.Ctx.JSON(200, sysmodel.SysReturn{400, "passowrd incorrect!", nil})
+			return
+		}
 
-		data:=sysmodel.LoginReturnInfo{user.Id,user.LoginId,user.Id}
+		token := &entitys.Token{}
+		if v := utils.GlobalTokenStore.Get(logininfo.Account + user.Domain); v == nil {
+			timestamp_str := strconv.FormatUint(timestamp, 10)
+			sec_tooken := utils.GenerateToken(logininfo.Account + timestamp_str)
+			token.AccessToken = sec_tooken
+			token.RefreshToken = sec_tooken
+			token.LoginID = logininfo.Account
+			token.UserId = user.Id
+			token.Result = 200
+			//token.Password = pwd
+			token.ServerIp = ""
+			token.Domain = user.Domain
+			utils.GlobalTokenStore.Set(sec_tooken, token)
+
+			//设置session
+			//fmt.Println("----------set token ----------", token.AccessToken)
+			//session := sessions.Default(c.Ctx)
+			//session.Set("token", token.AccessToken)
+			//session.Save()
+
+		} else {
+			token = v
+		}
+
+		data := sysmodel.LoginReturnInfo{user.Id, user.LoginId, token.AccessToken}
 		c.Ctx.JSON(200, sysmodel.SysReturn{200, "", data})
-	}else {
+	} else {
 		//fmt.Println(err.Error())
 		c.Ctx.JSON(200, sysmodel.SysReturn{400, "username or passowrd incorrect!", nil})
 	}
@@ -39,15 +77,18 @@ func System_Login(c *SystemController) {
 // @Failure 403 :id is empty
 func System_Logout(c *SystemController) {
 
+	token := c.Ctx.GetHeader("token")
+	fmt.Println("delete token: ", token)
+	utils.GlobalTokenStore.Remove(token)
+
 	ret := __none_func_system__()
 	if ret {
 		c.Ctx.JSON(200, sysmodel.SysReturn{200, "", nil})
-	}else{
+	} else {
 		c.Ctx.JSON(200, sysmodel.SysReturn{500, "", nil})
 	}
 }
 
-
 // _GetMenuTree
 // @Title _GetMenuTree
 // @Description 获取系统菜单
@@ -61,11 +102,11 @@ func System_GetMenuTree(c *SystemController) {
 	c.Db.SQL(sysmodel.Selectall_sys_menu).Find(&menus)
 
 	var menutree []sysmodel.SysMenuTree
-	finChildrenMenu( &menus, "", nil, &menutree)
-	for i:=0;i<len(menutree);i++{
-		finChildrenMenu( &menus, menutree[i].Id, &menutree[i], &menutree)
+	finChildrenMenu(&menus, "", nil, &menutree)
+	for i := 0; i < len(menutree); i++ {
+		finChildrenMenu(&menus, menutree[i].Id, &menutree[i], &menutree)
 	}
-	if ret{
+	if ret {
 		c.Ctx.JSON(200, sysmodel.SysReturn{200, "", menutree})
 	}
 }
@@ -83,40 +124,40 @@ func System_GetOrgTree(c *SystemController) {
 	c.Db.SQL(sysmodel.Selectall_sys_org).Find(&orgs)
 
 	var orgtree []sysmodel.SysOrgTree
-	finChildrenOrg( &orgs, "", nil, &orgtree)
-	for i:=0;i<len(orgtree);i++{
-		finChildrenOrg( &orgs, orgtree[i].Id, &orgtree[i], &orgtree)
+	finChildrenOrg(&orgs, "", nil, &orgtree)
+	for i := 0; i < len(orgtree); i++ {
+		finChildrenOrg(&orgs, orgtree[i].Id, &orgtree[i], &orgtree)
 	}
 
 	if ret {
 		c.Ctx.JSON(200, sysmodel.SysReturn{200, "", orgtree})
-	}else{
+	} else {
 		c.Ctx.JSON(200, sysmodel.SysReturn{500, "", nil})
 	}
 }
 
-func finChildrenOrg(menus *[]sysmodel.SysOrgTree, parent string, parent_menu* sysmodel.SysOrgTree, menutree *[]sysmodel.SysOrgTree) {
-	for _,m:= range *menus{
+func finChildrenOrg(menus *[]sysmodel.SysOrgTree, parent string, parent_menu *sysmodel.SysOrgTree, menutree *[]sysmodel.SysOrgTree) {
+	for _, m := range *menus {
 		if m.Parent == parent {
-			if parent_menu == nil{
+			if parent_menu == nil {
 				*menutree = append(*menutree, m)
 				//finChildrenMenu(menus, m.Id, menutree[len(*menutree)-1], menutree)
-			}else {
-				parent_menu.Children = append(parent_menu.Children,m)
+			} else {
+				parent_menu.Children = append(parent_menu.Children, m)
 				finChildrenOrg(menus, m.Id, &parent_menu.Children[len(parent_menu.Children)-1], menutree)
 			}
 		}
 	}
 }
 
-func finChildrenMenu(menus *[]sysmodel.SysMenuTree, parent string, parent_menu* sysmodel.SysMenuTree, menutree *[]sysmodel.SysMenuTree) {
-	for _,m:= range *menus{
+func finChildrenMenu(menus *[]sysmodel.SysMenuTree, parent string, parent_menu *sysmodel.SysMenuTree, menutree *[]sysmodel.SysMenuTree) {
+	for _, m := range *menus {
 		if m.Parent == parent {
-			if parent_menu == nil{
+			if parent_menu == nil {
 				*menutree = append(*menutree, m)
 				//finChildrenMenu(menus, m.Id, menutree[len(*menutree)-1], menutree)
-			}else {
-				parent_menu.Children = append(parent_menu.Children,m)
+			} else {
+				parent_menu.Children = append(parent_menu.Children, m)
 				finChildrenMenu(menus, m.Id, &parent_menu.Children[len(parent_menu.Children)-1], menutree)
 			}
 		}
@@ -130,20 +171,21 @@ func finChildrenMenu(menus *[]sysmodel.SysMenuTree, parent string, parent_menu*
 // @Success 200 {object} sysmodel.Account
 // @Failure 403 :id is empty
 func System_FindUserPage(c *SystemController) {
+
 	var getpageinfo sysmodel.GetPageInfo
 	c.Ctx.BindJSON(&getpageinfo)
 	__none_func_system__(getpageinfo)
 	fmt.Println(getpageinfo)
 	page := sysmodel.SysUserPageInfo{}
 	var users []sysmodel.SysUser
-	err := c.Db.SQL(sysmodel.Selectall_sys_user).Limit(getpageinfo.PageSize, (getpageinfo.PageNum -1)*getpageinfo.PageSize).Find(&users)
+	err := c.Db.SQL(sysmodel.Selectall_sys_user).Limit(getpageinfo.PageSize, (getpageinfo.PageNum-1)*getpageinfo.PageSize).Find(&users)
 	page.Content = users
 	page.PageSize = getpageinfo.PageSize
 	page.PageNum = getpageinfo.PageNum
 	page.TotalSize = 1
-	if err==nil{
+	if err == nil {
 		c.Ctx.JSON(200, sysmodel.SysReturn{200, "", page})
-	}else {
+	} else {
 		fmt.Println(err.Error())
 		c.Ctx.JSON(200, sysmodel.SysReturn{500, "", nil})
 	}
@@ -157,11 +199,15 @@ func System_FindUserPage(c *SystemController) {
 // @Success 200 {object} sysmodel.Account
 // @Failure 403 :id is empty
 func System_FindPermissions(c *SystemController) {
-	user := c.Ctx.Param(":user")
+	//获取用户id
+	tk, _ := c.Ctx.Get("token")
+	user := tk.(*entitys.Token)
+
+	//user := c.Ctx.Param(":user")
 	ret := __none_func_system__(user)
 	if ret {
 		c.Ctx.JSON(200, sysmodel.SysReturn{200, "", nil})
-	}else{
+	} else {
 		c.Ctx.JSON(200, sysmodel.SysReturn{500, "", nil})
 	}
 }
@@ -169,20 +215,36 @@ func System_FindPermissions(c *SystemController) {
 // _AddPermission
 // @Title _AddPermission
 // @Description 查找用户的菜单权限标识集合
-// @Param	user    string  false  "用户id"
-// @Success 200 {object} sysmodel.Account
+// @Param	perms    string  false  "权限标识"
+// @Param	domain    string  false  "域"
+// @Success 200 {object} models.Account
 // @Failure 403 :id is empty
 func System_AddPermission(c *SystemController) {
-	user := c.Ctx.Param(":user")
-	ret := __none_func_system__(user)
-	if ret {
+	perms := c.Ctx.Param(":perms")
+	domain := c.Ctx.Param(":domain")
+	ret := __none_func_system__(perms, domain)
+
+	//查找此权限标识符是否存在
+	//c.Db.Where().Get()
+
+	tk, _ := c.Ctx.Get("token")
+	user := tk.(*entitys.Token)
+
+	permiss := &sysmodel.SysPermission{}
+	permiss.Id = utils.NewUUID()
+	permiss.Perms = perms
+	permiss.Domain = domain
+	permiss.CreateBy = user.UserId
+	permiss.CreateTime = time.Now()
+	_, err := c.Db.Insert(permiss)
+
+	if ret && err == nil {
 		c.Ctx.JSON(200, sysmodel.SysReturn{200, "", nil})
-	}else{
-		c.Ctx.JSON(200, sysmodel.SysReturn{500, "", nil})
+	} else {
+		c.Ctx.JSON(200, sysmodel.SysReturn{500, err.Error(), nil})
 	}
 }
 
-
-func __none_func_system__(params ... interface{}) bool{
+func __none_func_system__(params ...interface{}) bool {
 	return true
 }

+ 19 - 20
controllers/SystemController_gen.go

@@ -1,30 +1,29 @@
-
 package controllers
 
 import (
+	"git.qianqiusoft.com/qianqiusoft/light-apiengine/engine"
+	"git.qianqiusoft.com/qianqiusoft/light-apiengine/entitys"
 	"github.com/gin-gonic/gin"
 	"github.com/xormplus/xorm"
-	"git.qianqiusoft.com/qianqiusoft/light-apiengine/engine"
 )
 
 // SystemController operations for System
 type SystemController struct {
-	Ctx *gin.Context
-	Db *xorm.Engine
+	Ctx    *gin.Context
+	Db     *xorm.Engine
 	engine *engine.ApiEngine
+	Token  *entitys.Token
 }
 
 func NewSystemController(c *gin.Context, e *engine.ApiEngine) *SystemController {
-	controller := &SystemController{c,e.OrmEngine,e}
+	controller := &SystemController{c, e.OrmEngine, e, nil}
 	return controller
 }
 
-
-
 // Login
 // @Title Login
-// @Description 用户登录         
-// @Param	logininfo      false  "登录信息"  
+// @Description 用户登录
+// @Param	logininfo      false  "登录信息"
 // @Success 200 {object} models.Account
 // @Failure 403 :id is empty
 // @router /login  [post,get,put]
@@ -35,7 +34,7 @@ func (c *SystemController) Login() {
 
 // Logout
 // @Title Logout
-// @Description 用户退出         
+// @Description 用户退出
 // @Success 200 {object} models.Account
 // @Failure 403 :id is empty
 // @router /logout  [post,get]
@@ -46,8 +45,8 @@ func (c *SystemController) Logout() {
 
 // GetMenuTree
 // @Title GetMenuTree
-// @Description 获取系统菜单         
-// @Param	user    string  false  "用户id"  
+// @Description 获取系统菜单
+// @Param	user    string  false  "用户id"
 // @Success 200 {object} models.Account
 // @Failure 403 :id is empty
 // @router /get_menu_tree  [post,get]
@@ -58,8 +57,8 @@ func (c *SystemController) GetMenuTree() {
 
 // FindUserPage
 // @Title FindUserPage
-// @Description 获取用户分布数据         
-// @Param	page      false  "分页参数"  
+// @Description 获取用户分布数据
+// @Param	page      false  "分页参数"
 // @Success 200 {object} models.Account
 // @Failure 403 :id is empty
 // @router /find_user_page  [post,get]
@@ -70,7 +69,7 @@ func (c *SystemController) FindUserPage() {
 
 // GetOrgTree
 // @Title GetOrgTree
-// @Description 获取组织架构树         
+// @Description 获取组织架构树
 // @Success 200 {object} models.Account
 // @Failure 403 :id is empty
 // @router /get_org_tree  [post,get]
@@ -81,8 +80,8 @@ func (c *SystemController) GetOrgTree() {
 
 // FindPermissions
 // @Title FindPermissions
-// @Description 查找用户的菜单权限标识集合         
-// @Param	user    string  false  "用户id"  
+// @Description 查找用户的菜单权限标识集合
+// @Param	user    string  false  "用户id"
 // @Success 200 {object} models.Account
 // @Failure 403 :id is empty
 // @router /find_permissions  [post,get,put]
@@ -93,8 +92,9 @@ func (c *SystemController) FindPermissions() {
 
 // AddPermission
 // @Title AddPermission
-// @Description 查找用户的菜单权限标识集合         
-// @Param	user    string  false  "用户id"  
+// @Description 查找用户的菜单权限标识集合
+// @Param	perms    string  false  "权限标识"
+// @Param	domain    string  false  "域"
 // @Success 200 {object} models.Account
 // @Failure 403 :id is empty
 // @router /add_permission  [post,get,put]
@@ -102,4 +102,3 @@ func (c *SystemController) AddPermission() {
 	//
 	System_AddPermission(c)
 }
-

+ 19 - 8
engine/apiengine.go

@@ -2,11 +2,16 @@ package engine
 
 import (
 	"fmt"
+	//"github.com/gin-contrib/sessions"
+	//"github.com/gin-contrib/sessions/memstore"
+	//"github.com/gin-contrib/sessions/cookie"
+
 	"os"
+
+	"git.qianqiusoft.com/qianqiusoft/light-apiengine/config"
+	"github.com/gin-contrib/cors"
 	"github.com/gin-gonic/gin"
 	"github.com/xormplus/xorm"
-	"github.com/gin-contrib/cors"
-	"git.qianqiusoft.com/qianqiusoft/light-apiengine/config"
 )
 
 type ApiEngine struct {
@@ -15,8 +20,8 @@ type ApiEngine struct {
 	listen_addr string
 }
 
-func Default()  *ApiEngine{
-	apiengine := NewApiEngine("mysql", config.AppConfig.DataSource, fmt.Sprintf(":%d",config.AppConfig.HttpPort))
+func Default() *ApiEngine {
+	apiengine := NewApiEngine("mysql", config.AppConfig.DataSource, fmt.Sprintf(":%d", config.AppConfig.HttpPort))
 	return apiengine
 }
 
@@ -24,18 +29,22 @@ func NewApiEngine(driverName, dataSourceName string, addr string) *ApiEngine {
 	engine := &ApiEngine{}
 	var err error
 	engine.OrmEngine, err = xorm.NewEngine(driverName, dataSourceName)
-	if err!=nil{
+	if err != nil {
 		fmt.Println(err.Error())
 	}
 	initOrmEngine(engine.OrmEngine, driverName)
 	engine.GinEngine = gin.Default()
-	_,err = os.Stat("doc/api.tpl")
+
+	//启动session
+	//store := sessions.NewCookieStore([]byte("secret"))
+	//engine.GinEngine.Use(sessions.Sessions("session", store))
+
+	_, err = os.Stat("doc/api.tpl")
 	if err == nil {
 		fmt.Println("LoadHTMLGlob.")
 		engine.GinEngine.LoadHTMLGlob("doc/*")
 	}
 
-
 	CreateDatabase(engine)
 
 	//cross domain
@@ -47,6 +56,8 @@ func NewApiEngine(driverName, dataSourceName string, addr string) *ApiEngine {
 	engine.GinEngine.Use(cors.New(config))
 	engine.listen_addr = addr
 
+	//设置登陆过滤
+
 	return engine
 }
 
@@ -87,6 +98,6 @@ func (g *ApiEngine) SyncDb(beans ...interface{}) error {
 func (g *ApiEngine) Run() {
 	InitDbData(g)
 	g.GinEngine.StaticFile("/", "web/index.html")
-	g.GinEngine.Static("/static","web/static")
+	g.GinEngine.Static("/static", "web/static")
 	g.GinEngine.Run(g.listen_addr)
 }

+ 13 - 0
entitys/token.go

@@ -0,0 +1,13 @@
+package entitys
+
+type Token struct {
+	Result       int    `json:"-"`
+	UserId       string `json:"user_id"`
+	AccessToken  string `json:"access_token"`
+	RefreshToken string `json:"refresh_token"`
+	LoginID      string `json:"login_id"`
+	TimeStamp    uint64 `json:"time_stamp"`
+	ServerIp     string `json:"server_ip"`
+	Domain       string `json:"domain"`
+	Password     string `json:"-"`
+}

+ 22 - 0
middleware/login_ware.go

@@ -0,0 +1,22 @@
+package middleware
+
+import (
+	sysmodel "git.qianqiusoft.com/qianqiusoft/light-apiengine/models"
+	"git.qianqiusoft.com/qianqiusoft/light-apiengine/utils"
+	"github.com/gin-gonic/gin"
+)
+
+func LoginWare() gin.HandlerFunc {
+	return func(c *gin.Context) {
+		//fmt.Println("--LoginWare----")
+		//验证登陆
+		token := c.GetHeader("token")
+		if token == "" {
+			c.AbortWithStatusJSON(200, sysmodel.SysReturn{500, "token is empty", ""})
+		}
+
+		tk := utils.GlobalTokenStore.Get(token)
+		c.Set("token", tk)
+		c.Next()
+	}
+}

+ 11 - 0
models/Sql_SysPermission_gen.go

@@ -0,0 +1,11 @@
+
+package models
+    var Insert_sys_permission = "insert into sys_permission(`id`,`perms`,`domain`,`create_by`,`create_time`,`last_update_by`,`last_update_date`,`del_flag`) values (?id,?perms,?domain,?create_by,?create_time,?last_update_by,?last_update_date,?del_flag)"
+
+    var Update_sys_permission = "update sys_permission set `perms` = ?perms,`domain` = ?domain,`create_by` = ?create_by,`create_time` = ?create_time,`last_update_by` = ?last_update_by,`last_update_date` = ?last_update_date,`del_flag` = ?del_flag where id = ?id"
+
+    var Deleteone_sys_permission = "delete from sys_permissionwhere id =?id"
+
+    var Selectone_sys_permission = "select `id`,`perms`,`domain`,`create_by`,`create_time`,`last_update_by`,`last_update_date`,`del_flag` from sys_permission where id = ?id"
+
+    var Selectall_sys_permission = "select `id`,`perms`,`domain`,`create_by`,`create_time`,`last_update_by`,`last_update_date`,`del_flag` from sys_permission"

+ 11 - 0
models/Sql_SysRolePermission_gen.go

@@ -0,0 +1,11 @@
+
+package models
+    var Insert_sys_role_permission = "insert into sys_role_permission(`id`,`permission_id`,`role_id`,`domain`,`create_by`,`create_time`,`last_update_by`,`last_update_date`,`del_flag`) values (?id,?permission_id,?role_id,?domain,?create_by,?create_time,?last_update_by,?last_update_date,?del_flag)"
+
+    var Update_sys_role_permission = "update sys_role_permission set `permission_id` = ?permission_id,`role_id` = ?role_id,`domain` = ?domain,`create_by` = ?create_by,`create_time` = ?create_time,`last_update_by` = ?last_update_by,`last_update_date` = ?last_update_date,`del_flag` = ?del_flag where id = ?id"
+
+    var Deleteone_sys_role_permission = "delete from sys_role_permissionwhere id =?id"
+
+    var Selectone_sys_role_permission = "select `id`,`permission_id`,`role_id`,`domain`,`create_by`,`create_time`,`last_update_by`,`last_update_date`,`del_flag` from sys_role_permission where id = ?id"
+
+    var Selectall_sys_role_permission = "select `id`,`permission_id`,`role_id`,`domain`,`create_by`,`create_time`,`last_update_by`,`last_update_date`,`del_flag` from sys_role_permission"

+ 29 - 0
models/SysPermission_gen.go

@@ -0,0 +1,29 @@
+
+package models
+import (
+"time"
+)
+
+type SysPermission struct {
+	//主键
+	Id   string    `xorm:"'id' varchar(36) pk notnull "json:"id"`
+	//权限标识
+	Perms   string    `xorm:"'perms' varchar(100) notnull "json:"perms"`
+	//域
+	Domain   string    `xorm:"'domain' notnull "json:"domain"`
+	//创建人
+	CreateBy   string    `xorm:"'create_by' varchar(36) notnull "json:"create_by"`
+	//创建时间
+	CreateTime   time.Time    `xorm:"'create_time' notnull "json:"create_time"`
+	//最后更新人
+	LastUpdateBy   string    `xorm:"'last_update_by' varchar(36) notnull "json:"last_update_by"`
+	//最后更新时间
+	LastUpdateDate   time.Time    `xorm:"'last_update_date' notnull "json:"last_update_date"`
+	//是否删除 0:删除   1:正常
+	DelFlag   int32    `xorm:"'del_flag' notnull "json:"del_flag"`
+
+}
+
+func (t *SysPermission) TableName() string {
+	return "sys_permission"
+}

+ 31 - 0
models/SysRolePermission_gen.go

@@ -0,0 +1,31 @@
+
+package models
+import (
+"time"
+)
+
+type SysRolePermission struct {
+	//主键
+	Id   string    `xorm:"'id' varchar(36) pk notnull "json:"id"`
+	//权限ID
+	PermissionId   string    `xorm:"'permission_id' varchar(36) notnull "json:"permission_id"`
+	//角色ID
+	RoleId   string    `xorm:"'role_id' varchar(36) notnull "json:"role_id"`
+	//域
+	Domain   string    `xorm:"'domain' notnull "json:"domain"`
+	//创建人
+	CreateBy   string    `xorm:"'create_by' varchar(36) notnull "json:"create_by"`
+	//创建时间
+	CreateTime   time.Time    `xorm:"'create_time' notnull "json:"create_time"`
+	//最后更新人
+	LastUpdateBy   string    `xorm:"'last_update_by' varchar(36) notnull "json:"last_update_by"`
+	//最后更新时间
+	LastUpdateDate   time.Time    `xorm:"'last_update_date' notnull "json:"last_update_date"`
+	//是否删除 0:删除   1:正常
+	DelFlag   int32    `xorm:"'del_flag' notnull "json:"del_flag"`
+
+}
+
+func (t *SysRolePermission) TableName() string {
+	return "sys_role_permission"
+}

+ 62 - 63
routers/router_gen.go

@@ -1,114 +1,113 @@
-
 package routers
 
 import (
-	"github.com/gin-gonic/gin"
 	"git.qianqiusoft.com/qianqiusoft/light-apiengine/controllers"
+	"git.qianqiusoft.com/qianqiusoft/light-apiengine/engine"
+	"git.qianqiusoft.com/qianqiusoft/light-apiengine/middleware"
 	"git.qianqiusoft.com/qianqiusoft/light-apiengine/models"
-    "git.qianqiusoft.com/qianqiusoft/light-apiengine/engine"
+	"git.qianqiusoft.com/qianqiusoft/light-apiengine/utils"
+	"github.com/gin-gonic/gin"
 )
 
 var g_engine *engine.ApiEngine
 
-
-
-
-func systemController_login(c* gin.Context)  {
-	controllers.NewSystemController(c,g_engine).Login()
+func init() {
+	utils.GlobalTokenStore = utils.NewTokenStore()
 }
 
-func systemController_logout(c* gin.Context)  {
-	controllers.NewSystemController(c,g_engine).Logout()
+func systemController_login(c *gin.Context) {
+	controllers.NewSystemController(c, g_engine).Login()
 }
 
-func systemController_get_menu_tree(c* gin.Context)  {
-	controllers.NewSystemController(c,g_engine).GetMenuTree()
+func systemController_logout(c *gin.Context) {
+	controllers.NewSystemController(c, g_engine).Logout()
 }
 
-func systemController_find_user_page(c* gin.Context)  {
-	controllers.NewSystemController(c,g_engine).FindUserPage()
+func systemController_get_menu_tree(c *gin.Context) {
+	controllers.NewSystemController(c, g_engine).GetMenuTree()
 }
 
-func systemController_get_org_tree(c* gin.Context)  {
-	controllers.NewSystemController(c,g_engine).GetOrgTree()
+func systemController_find_user_page(c *gin.Context) {
+	controllers.NewSystemController(c, g_engine).FindUserPage()
 }
 
-func systemController_find_permissions(c* gin.Context)  {
-	controllers.NewSystemController(c,g_engine).FindPermissions()
+func systemController_get_org_tree(c *gin.Context) {
+	controllers.NewSystemController(c, g_engine).GetOrgTree()
 }
 
-func systemController_add_permission(c* gin.Context)  {
-	controllers.NewSystemController(c,g_engine).AddPermission()
+func systemController_find_permissions(c *gin.Context) {
+	controllers.NewSystemController(c, g_engine).FindPermissions()
 }
 
+func systemController_add_permission(c *gin.Context) {
+	controllers.NewSystemController(c, g_engine).AddPermission()
+}
 
-
-
-func apiController_api_doc(c* gin.Context)  {
-	controllers.NewApiController(c,g_engine).ApiDoc()
+func apiController_api_doc(c *gin.Context) {
+	controllers.NewApiController(c, g_engine).ApiDoc()
 }
 
+func SyncDb(e *engine.ApiEngine) {
 
+	e.OrmEngine.Sync2(new(models.SysUser))
 
-func SyncDb(e *engine.ApiEngine) {
+	e.OrmEngine.Sync2(new(models.SysOrg))
 
-	e.OrmEngine.Sync2(new (models.SysUser))
+	e.OrmEngine.Sync2(new(models.SysRole))
 
-	e.OrmEngine.Sync2(new (models.SysOrg))
+	e.OrmEngine.Sync2(new(models.SysUserRole))
 
-	e.OrmEngine.Sync2(new (models.SysRole))
+	e.OrmEngine.Sync2(new(models.SysMenu))
 
-	e.OrmEngine.Sync2(new (models.SysUserRole))
+	e.OrmEngine.Sync2(new(models.SysRoleMenu))
 
-	e.OrmEngine.Sync2(new (models.SysMenu))
+	e.OrmEngine.Sync2(new(models.SysPermission))
 
-	e.OrmEngine.Sync2(new (models.SysRoleMenu))
+	e.OrmEngine.Sync2(new(models.SysRolePermission))
 
 }
 
-func InitRouter(e *engine.ApiEngine)  {
+func InitRouter(e *engine.ApiEngine) {
 	g_engine = e
 	SyncDb(e)
-	api:=e.GinEngine.Group("/api")
-	v1:=api.Group("/v1")
-
-
+	api := e.GinEngine.Group("/api")
+	v1 := api.Group("/v1")
 
-	v1.GET("/system/login",systemController_login)
-	v1.POST("/system/login",systemController_login)
-    v1.PUT("/system/login",systemController_login)
+	system := v1.Group("/system")
+	system.GET("/login", systemController_login)
+	system.POST("/login", systemController_login)
+	system.PUT("/login", systemController_login)
+	system.GET("/system/logout", systemController_logout)
+	system.POST("/system/logout", systemController_logout)
 
-	v1.GET("/system/logout",systemController_logout)
-	v1.POST("/system/logout",systemController_logout)
-    //v1.PUT("/system/logout",systemController_logout)
+	v1.Use(middleware.LoginWare())
 
-	v1.GET("/system/get_menu_tree",systemController_get_menu_tree)
-	v1.POST("/system/get_menu_tree",systemController_get_menu_tree)
-    //v1.PUT("/system/get_menu_tree",systemController_get_menu_tree)
+	//v1.GET("/system/login", systemController_login)
+	//v1.POST("/system/login", systemController_login)
+	//v1.PUT("/system/login", systemController_login)
 
-	v1.GET("/system/find_user_page",systemController_find_user_page)
-	v1.POST("/system/find_user_page",systemController_find_user_page)
-    //v1.PUT("/system/find_user_page",systemController_find_user_page)
+	v1.GET("/system/get_menu_tree", systemController_get_menu_tree)
+	v1.POST("/system/get_menu_tree", systemController_get_menu_tree)
+	//v1.PUT("/system/get_menu_tree",systemController_get_menu_tree)
 
-	v1.GET("/system/get_org_tree",systemController_get_org_tree)
-	v1.POST("/system/get_org_tree",systemController_get_org_tree)
-    //v1.PUT("/system/get_org_tree",systemController_get_org_tree)
+	v1.GET("/system/find_user_page", systemController_find_user_page)
+	v1.POST("/system/find_user_page", systemController_find_user_page)
+	//v1.PUT("/system/find_user_page",systemController_find_user_page)
 
-	v1.GET("/system/find_permissions",systemController_find_permissions)
-	v1.POST("/system/find_permissions",systemController_find_permissions)
-    v1.PUT("/system/find_permissions",systemController_find_permissions)
+	v1.GET("/system/get_org_tree", systemController_get_org_tree)
+	v1.POST("/system/get_org_tree", systemController_get_org_tree)
+	//v1.PUT("/system/get_org_tree",systemController_get_org_tree)
 
-	v1.GET("/system/add_permission",systemController_add_permission)
-	v1.POST("/system/add_permission",systemController_add_permission)
-    v1.PUT("/system/add_permission",systemController_add_permission)
+	v1.GET("/system/find_permissions", systemController_find_permissions)
+	v1.POST("/system/find_permissions", systemController_find_permissions)
+	v1.PUT("/system/find_permissions", systemController_find_permissions)
 
+	v1.GET("/system/add_permission", systemController_add_permission)
+	v1.POST("/system/add_permission", systemController_add_permission)
+	v1.PUT("/system/add_permission", systemController_add_permission)
 
-
-
-	v1.GET("/api/api_doc",apiController_api_doc)
+	v1.GET("/api/api_doc", apiController_api_doc)
 	//v1.POST("/api/api_doc",apiController_api_doc)
-    //v1.PUT("/api/api_doc",apiController_api_doc)
-
+	//v1.PUT("/api/api_doc",apiController_api_doc)
 
 }
-

+ 155 - 0
utils/config.go

@@ -0,0 +1,155 @@
+// Copyright (c) 2015 qianqiusoft.com
+// Licensed to You under the GNU Affero GPL v3
+// See the LICENSE file at git.qianqiusoft.com/qianqiusoft/light-vocation/LICENSE
+// http://www.gnu.org/licenses/why-affero-gpl.en.html
+
+// config.go
+package utils
+
+import (
+	"errors"
+	"fmt"
+	"os"
+	"strconv"
+	"strings"
+
+	"github.com/astaxie/beego"
+)
+
+type ConfigHelper struct {
+}
+
+func NewConfig() *ConfigHelper {
+	return &ConfigHelper{}
+}
+
+// get string value of the config by the key
+// the value is from env or app.conf
+func (this *ConfigHelper) String(key string) string {
+	key = strings.TrimSpace(key)
+	if key == "" {
+		beego.Error("ConfigHelper.String : param key is empty")
+		return ""
+	}
+	val := os.Getenv(key)
+	val = strings.TrimSpace(val)
+	if val == "" {
+		val = beego.AppConfig.String(key)
+		val = strings.TrimSpace(val)
+	}
+
+	return val
+}
+
+// get int value of config by key
+// the value is from env or app.conf
+// param key : key
+// param defaultValue : default value
+func (this *ConfigHelper) Int64(key string, defaultValue int64) (int64, error) {
+	key = strings.TrimSpace(key)
+	if key == "" {
+		beego.Error("ConfigHelper.Int64 : param key is empty")
+		return 0, errors.New("param ke is empty")
+	}
+	val := os.Getenv(key)
+	val = strings.TrimSpace(val)
+	if val == "" {
+		val = beego.AppConfig.String(key)
+		val = strings.TrimSpace(val)
+		beego.Debug(fmt.Sprintf("ConfigHelper.Int64 value of key %s is %s from app.conf", key, val))
+	} else {
+		beego.Debug(fmt.Sprintf("ConfigHelper.Int64 value of key %s is %s from env", key, val))
+	}
+
+	if val == "" {
+		beego.Debug("ConfigHelper.Bool return default value ")
+		return defaultValue, nil
+	}
+
+	return strconv.ParseInt(val, 10, 64)
+}
+
+// get bool value of config by key
+// the value is from env or app.conf
+// param key : key
+// param defaultValue : default value
+func (this *ConfigHelper) Bool(key string, defaultValue bool) (bool, error) {
+	key = strings.TrimSpace(key)
+	if key == "" {
+		beego.Error("ConfigHelper.Bool : param key is empty")
+		return false, errors.New("param ke is empty")
+	}
+
+	val := os.Getenv(key)
+	val = strings.TrimSpace(val)
+	if val == "" {
+		val = beego.AppConfig.String(key)
+		val = strings.TrimSpace(val)
+		beego.Debug(fmt.Sprintf("ConfigHelper.Bool value of key %s is %s from app.conf", key, val))
+	} else {
+		beego.Debug(fmt.Sprintf("ConfigHelper.Bool value of key %s is %s from env", key, val))
+	}
+
+	if val == "" {
+		beego.Debug("ConfigHelper.Bool return default value ")
+		return defaultValue, nil
+	}
+
+	return strconv.ParseBool(val)
+}
+
+// get the string value from env
+// param key : key
+// return : it will be "" if there is not key
+func (this *ConfigHelper) StringEnv(key string) string {
+	key = strings.TrimSpace(key)
+	if key == "" {
+		beego.Error("utConfigHelperils.StringEnv : param key is empty")
+		return ""
+	}
+	val := os.Getenv(key)
+	val = strings.TrimSpace(val)
+
+	return val
+}
+
+// get the int64 value from env
+// param key : key
+// return : value and error
+func (this *ConfigHelper) Int64Env(key string) (int64, error) {
+	key = strings.TrimSpace(key)
+	if key == "" {
+		beego.Error("ConfigHelper.Int64Env : param key is empty")
+		return 0, errors.New("param ke is empty")
+	}
+	val := os.Getenv(key)
+	val = strings.TrimSpace(val)
+
+	if val == "" {
+		beego.Debug("ConfigHelper.Bool return default value ")
+		return 0, errors.New("value of key is not exists")
+	}
+
+	return strconv.ParseInt(val, 10, 64)
+}
+
+// get bool value of config by key from env
+// param key : key
+// return : value and error
+func (this *ConfigHelper) BoolEnv(key string, defaultValue bool) (bool, error) {
+	key = strings.TrimSpace(key)
+	if key == "" {
+		beego.Error("ConfigHelper.Bool : param key is empty")
+		return false, errors.New("param ke is empty")
+	}
+
+	val := os.Getenv(key)
+	val = strings.TrimSpace(val)
+
+	if val == "" {
+		beego.Debug("ConfigHelper.Bool return default value ")
+		return false, errors.New("value of key is not exists")
+	}
+
+	return strconv.ParseBool(val)
+}

+ 51 - 0
utils/pwd.go

@@ -0,0 +1,51 @@
+// Copyright (c) 2015 qianqiusoft.com
+// Licensed to You under the GNU Affero GPL v3
+// See the LICENSE file at git.qianqiusoft.com/qianqiusoft/light-vocation/LICENSE
+// http://www.gnu.org/licenses/why-affero-gpl.en.html
+
+package utils
+
+import (
+	"crypto/md5"
+	"encoding/base64"
+	"encoding/hex"
+
+	"github.com/astaxie/beego"
+)
+
+func HashPassword(password, salt string) string {
+	h := md5.New()
+	enableDbSalt, _ := NewConfig().Bool("System::EnableDBSalt", true) //beego.AppConfig.Bool("System::EnableDBSalt")
+	customSalt := NewConfig().String("System::PasswordSalt")          //beego.AppConfig.String("System::PasswordSalt")
+	enableBase64, _ := NewConfig().Bool("System::PasswordEnableBase64", true)
+	if !enableDbSalt {
+		h.Write([]byte(password))
+		if len(customSalt) > 0 {
+			//fmt.Println(customSalt)
+			md5Str := base64.StdEncoding.EncodeToString(h.Sum(nil))
+			h.Reset()
+			h.Write([]byte(md5Str + customSalt))
+		}
+		//if beego.AppConfig.String("System::PasswordEnableBase64") == "true" {
+		if enableBase64 {
+			base64_str := base64.StdEncoding.EncodeToString(h.Sum(nil))
+			beego.Debug("启用编码:", base64_str)
+			return base64_str
+		} else {
+			str := hex.EncodeToString(h.Sum(nil))
+			beego.Debug("未启用编码:", str)
+			return str
+		}
+	} else {
+		h.Write([]byte(password))
+		md5Str := hex.EncodeToString(h.Sum(nil))
+		beego.Debug("第一次加密:", md5Str)
+		if len(salt) > 0 {
+			h.Reset()
+			h.Write([]byte(md5Str + salt))
+			md5Str = hex.EncodeToString(h.Sum(nil))
+		}
+		beego.Debug("第二次加密:", md5Str)
+		return md5Str
+	}
+}

+ 93 - 0
utils/store.go

@@ -0,0 +1,93 @@
+package utils
+
+import (
+	"log"
+	"sync"
+	"time"
+
+	"git.qianqiusoft.com/qianqiusoft/light-apiengine/entitys"
+
+	lvutils "git.qianqiusoft.com/qianqiusoft/light-vocation/utils"
+)
+
+type TokenStore struct {
+	name   string
+	lock   *sync.RWMutex
+	tokens map[string]*entitys.Token
+}
+
+var GlobalTokenStore *TokenStore
+
+func NewTokenStore() *TokenStore {
+	t := &TokenStore{name: "sso", lock: new(sync.RWMutex), tokens: make(map[string]*entitys.Token)}
+	go t.startTokenCheckProcess()
+	return t
+}
+
+func (t *TokenStore) Get(key string) *entitys.Token {
+	t.lock.RLock()
+	defer t.lock.RUnlock()
+	if val, ok := t.tokens[key]; ok {
+		log.Println(key, "获取Token:", val.AccessToken, val.RefreshToken, val.LoginID)
+		return val
+	}
+	return nil
+}
+
+func (t *TokenStore) Set(key string, v *entitys.Token) {
+	t.lock.Lock()
+	defer t.lock.Unlock()
+	if val, ok := t.tokens[key]; !ok {
+		t.tokens[key] = v
+	} else if val != v {
+		t.tokens[key] = v
+	}
+	log.Println(key, "添加Token:", v.AccessToken, v.RefreshToken, v.LoginID)
+}
+
+func (t *TokenStore) Remove(key string) {
+	t.lock.Lock()
+	defer t.lock.Unlock()
+	delete(t.tokens, key)
+	log.Println(key, "删除Key")
+}
+
+func (t *TokenStore) Refresh(key string) {
+	t.lock.Lock()
+	defer t.lock.Unlock()
+
+	val, ok := t.tokens[key]
+	if ok {
+		val.TimeStamp = uint64(time.Now().UnixNano())
+	}
+}
+
+func (t *TokenStore) startTokenCheckProcess() {
+	autoRefresh, _ := lvutils.NewConfig().Bool("auto_refresh", false)
+	if !autoRefresh {
+		return
+	}
+	var duration time.Duration = time.Second * 3600
+	t1 := time.NewTicker(duration)
+	for {
+		select {
+		case <-t1.C:
+			t.lock.Lock()
+
+			keys := []string{}
+			for k, v := range t.tokens {
+				timestampt := time.Unix(int64(v.TimeStamp), 0)
+				subval := time.Now().Sub(timestampt)
+
+				if subval.Seconds() < 0 || subval.Seconds() > 3600 {
+					keys = append(keys, k)
+				}
+			}
+			for _, k := range keys {
+				delete(t.tokens, k)
+			}
+
+			t.lock.Unlock()
+		}
+	}
+}

+ 17 - 0
utils/token.go

@@ -0,0 +1,17 @@
+package utils
+
+import (
+	"crypto/hmac"
+	"crypto/sha1"
+	"encoding/hex"
+)
+
+const (
+	hmac_key = "hmac_key_"
+)
+
+func GenerateToken(plain string) string {
+	hash := hmac.New(sha1.New, []byte(hmac_key))
+	hash.Write([]byte(plain))
+	return hex.EncodeToString(hash.Sum(nil))
+}