beego —— 登录及验证

1,765 阅读1分钟

1.创建模型Member结构体

type Member struct {
	MemberId int `orm:"pk;auto" json:"member_id"`
    Account string `orm:"size(30);unique" json:"account"`
    Nickname string `orm:"size(30);unique" json:"nickname"`
    Password string `json:"-"`
    Description string `orm:"size(640)" json:"description"`
    Email string `orm:"size(100);unique" json:"email"`
    Phone string `orm:"size(20);null;default(null)" json:"phone"`
    Avatar string `json:"avatar"`
    Role int `orm:"default(1)" json:"role"`
    RoleName string `orm:"-" json:"role_name"`
    Status int `orm:"default(0)" json:"status"`
    CreateTime time.Time `orm:"type(datetime);auto_now_add" json:"create_time"`
    CreateAt int `json:"create_at"`
    LastLoginTime time.Time `orm:"type(datetime);null" json:"last_login_time"`
}

func (m *Member) TableName() string {
	return "md_member"
}

func NewMember() member *Member {
	return &Member{}
}

2.在BaseController里创建验证

import "github.com/astaxie/beego"
import "go_mbook/models"
import "time"

type BaseController struct {
	beego.Controller
    Member *models.Member	// 用户
    Option map[string]string	// 全局设置
    EnableAnonymous bool	// 是否开启匿名访问
}

// 创建cookie存取结构体
type CookieRemember struct {
	MemberId int
    Account string
    Time time.Time
}

// PrePare函数里,做验证处理,这样继承它的所有结构体都会经过验证
func (c *BaseController) PrePare() {
	// 初始化
    c.Member = models.NewMember()
    c.EnableAnonymous = false
    
    // 从session中去尝试获取用户信息
    if member, ok := c.GetSession(common.SessionName).(models.Member); ok && member.MemberId > 0 {	// 因为GetSession返回的是interface{}类型,所以需要断言获取
    c.Member = &member
    }
} else {
	// //如果Cookie中存在登录信息,从cookie中获取用户信息
    if cookie, ok := c.GetSecureCookie(common.AppKey(), "login"); ok {
    	var remember CookieRemember
        err := utils.Decode(cookie, &remember)
        if err == nil {
        	member, err := models.NewMember().Find(remember.MemberId)	// 这里就是根据memberId查询数据库
            if err == nil {
            	c.SetMember(*member)	// 在内存地址前面加 * 就可以获取其中内存对应的值
            	c.Member = member	// 赋值引用
            }
        }
    }
}

// 设置登录用户信息
func (c *BaseController) SetMember(member models.Member) {
	if member.MemberId <= 0 {
    	c.DelSession(common.SessionName)
        c.DelSession("uid")
        c.DestroySession()
    } else {
    	c.SetSession(common.SessionName, member)
        c.SetSession("uid", member.MemberId)
    }
}

3. 登录逻辑

//登录
var remember CookieRemember
// 验证cookie
if cookie, ok := c.GetSecureCookie(common.AppKey(), "login"); ok {
	if err := utils.Decode(cookie, &remember); err == nil {
    	if err = c.login(remember.MemberId); err == nil {
        	c.Redirect(beego.URLFor("HomeController.Index"), 302)
            return
        }
    } 
}
// 如果是post请求
if c.Ctx.Input.IsPost() {
		account := c.GetString("account")
		password := c.GetString("password")
		member, err := models.NewMember().Login(account, password)
		fmt.Println(err)
		if err != nil {
			c.JsonResult(1, "登录失败", nil)
		}
		member.LastLoginTime = time.Now()
		member.Update()
		c.SetMember(*member)
		remember.MemberId = member.MemberId
		remember.Account = member.Account
		remember.Time = time.Now()
		v, err := utils.Encode(remember)	// 这里是封装的encode cookie的包
		if err == nil {
			c.SetSecureCookie(common.AppKey(), "login", v, 24*3600*365)
		}
		c.JsonResult(0, "ok")
	}

	c.Data["RandomStr"] = time.Now().Unix()