程序目录结构
简单实现,用户登录后返回一个jwt的token,下次请求带上token请求用户信息接口并返回信息。
app.conf文件内容(可以用个beego直接读取里面的内容)写的是一个jwt的secretkey
jwtkey="12345678"
config.json里面保存的是连接数据库的用户名和密码(这里只是学习如何读取json的配置文件,可以集成到beego的app.conf文件里)
{ "sqltype":"mssql" ,"connstring":"server=.;port=1433;user id=sa;password=123;database=table1" }
MSSqlHelper.go实现连接mssqlserver的数据库
package mssqlhelper import ( "fmt" "github.com/akkuman/parseConfig" _ "github.com/denisenkom/go-mssqldb" "github.com/go-xorm/core" "github.com/go-xorm/xorm" ) // 创建 XORM 客户端 func CreateClient() *xorm.Engine { var config = parseConfig.New("config.json") sqltype := config.Get("sqltype") fmt.Println(sqltype) connstring := config.Get("connstring") fmt.Println(connstring) engine, err := xorm.NewEngine(sqltype.(string), connstring.(string)) if err != nil { println("open error:", &err) } engine.SetMapper(core.SameMapper{}) //表示Struct的类的名称和数据库中相同 engine.ShowSQL(true) //显示SQL语句 engine.Logger().SetLevel(core.LOG_DEBUG) //打印SQL语句 return engine }
AuthorizeController.go实现用户登录、获取用户信息接口
package controller import ( "GoApi/DAL" "GoApi/Model" "encoding/json" "fmt" "net/http" "strconv" "strings" "time" "github.com/astaxie/beego/context" "github.com/astaxie/beego" jwt "github.com/dgrijalva/jwt-go" "github.com/go-xorm/xorm" ) var engine *xorm.Engine type AuthorizeController struct { beego.Controller } var filterUser = func(ctx *context.Context) { token := ctx.Input.Header("Authorization") b, _ := CheckToken(token) //验证Token是否合法 if !b { http.Error(ctx.ResponseWriter, "Token verification not pass", http.StatusBadRequest) return } fmt.Println("Request token:", token) } func init() { engine = mssqlhelper.CreateClient() //访问接口前验证token beego.InsertFilter("/Authorize/Userinfo", beego.BeforeRouter, filterUser) } type Token struct { Token string `json:"token"` } func fatal(err error) { if err != nil { beego.Error(err) } } //登录 func (this *AuthorizeController) Login() { var user Model.LoginModel // url?username=111&password=222 这种形式 user.UserName = this.GetString("username") user.PassWord = this.GetString("password") //err := this.ParseForm(&user) //接收application/x-www-form-urlencoded形式POST传递数据,如Username=111&Password=2222 // err := json.NewDecoder(this.Ctx.Request.Body).Decode(&user) //接收json形式Post的数据 loginuser := &Model.Usertable{Userloginname: user.UserName} has, err := engine.Get(loginuser) if err != nil { fatal(err) } if !has { fatal(err) http.Error(this.Ctx.ResponseWriter, "User Not Exist", http.StatusBadRequest) return } if user.PassWord != loginuser.Userloginpwd { this.Ctx.Output.Header("SetStatus", strconv.Itoa(http.StatusBadRequest)) http.Error(this.Ctx.ResponseWriter, "Password Wrong&q