github.com/insionng/yougam@v0.0.0-20170714101924-2bc18d833463/routers/SigninHandler.go (about)

     1  package routers
     2  
     3  import (
     4  	"fmt"
     5  	"strings"
     6  	"time"
     7  
     8  	"github.com/insionng/yougam/helper"
     9  	"github.com/insionng/yougam/models"
    10  
    11  	"github.com/insionng/makross"
    12  	"github.com/insionng/makross/cache"
    13  	"github.com/insionng/makross/captcha"
    14  )
    15  
    16  func GetSigninHandler(self *makross.Context) error {
    17  
    18  	var IsSignin bool
    19  	if _, okay := self.Session.Get("SignedUser").(*models.User); okay {
    20  		IsSignin = okay
    21  	}
    22  
    23  	TplNames := "signin"
    24  	self.Set("catpage", "SigninHandler")
    25  	self.Set("IsCaptcha", helper.IsCaptcha)
    26  
    27  	remember, _ := self.GetCookie("remember")
    28  	if IsSignin { //如果已登录
    29  		if next := self.Args("next").String(); len(next) > 0 {
    30  			return self.Redirect(next)
    31  		}
    32  		return self.Redirect("/")
    33  	} else { //如果未登录
    34  		if remember != nil {
    35  			if remember.Value == "true" {
    36  				self.Set("remember", "true")
    37  			} else {
    38  				self.Set("remember", nil)
    39  			}
    40  		}
    41  
    42  	}
    43  	return self.Render(TplNames)
    44  }
    45  
    46  func PostSigninHandler(self *makross.Context) error {
    47  
    48  	TplNames := "signin"
    49  	cpt := new(captcha.Captcha)
    50  	allow := false
    51  	if helper.IsCaptcha {
    52  		cpt = captcha.Store(self)
    53  		allow = cpt.VerifyReq(self)
    54  	}
    55  	if helper.IsCaptcha && (!allow) {
    56  		if len(self.Args(cpt.FieldCaptchaName).String()) > 0 {
    57  			self.Flash.Error("验证码错误~")
    58  		} else {
    59  			self.Flash.Error("验证码为空~")
    60  		}
    61  		return self.Render(TplNames)
    62  	}
    63  
    64  	cc := cache.Store(self)
    65  
    66  	//Secret := helper.MD5(self.Req.UserAgent() + helper.AesConstKey)
    67  	self.Set("catpage", "SigninHandler")
    68  
    69  	password := self.Args("password").String()
    70  	self.Set("tmppassword", password)
    71  	self.Set("tmpemail", self.Args("email").String())
    72  	remember := self.Args("remember").String()
    73  
    74  	if len(password) == 0 {
    75  		self.Flash.Error("密码为空~")
    76  		return self.Render(TplNames)
    77  	}
    78  
    79  	if helper.CheckPassword(password) == false {
    80  		self.Flash.Error("密码含有非法字符或密码过短(至少4~30位密码)!")
    81  		return self.Render(TplNames)
    82  	}
    83  
    84  	var err error
    85  	var usr = new(models.User)
    86  	var email, username string
    87  	if isEmail := strings.Contains(self.Args("email").String(), "@"); isEmail {
    88  		email = self.Args("email").String()
    89  		if len(email) == 0 {
    90  			self.Flash.Error("EMAIL为空~")
    91  			goto render
    92  		}
    93  
    94  		if helper.CheckEmail(email) == false {
    95  			self.Flash.Error("Email格式不合符规格~")
    96  			goto render
    97  		}
    98  
    99  		usr, err = models.GetUserByEmail(email)
   100  	} else {
   101  		username = self.Args("email").String()
   102  		if len(username) == 0 {
   103  			self.Flash.Error("用户名称为空~")
   104  			goto render
   105  		}
   106  
   107  		if helper.CheckUsername(username) == false {
   108  			self.Flash.Error("用户名称格式不合符规格~")
   109  			goto render
   110  		}
   111  
   112  		usr, err = models.GetUserByUsername(username)
   113  	}
   114  
   115  	if (usr != nil) && (err == nil) {
   116  
   117  		if helper.ValidateHash(usr.Password, password) {
   118  
   119  			//登录成功设置session
   120  			self.Session.Set("SignedUserID", usr.Id)
   121  			self.Session.Set("SignedUserName", usr.Username)
   122  			self.Session.Set("SignedUser", usr)
   123  
   124  			self.Set("IsSigned", true)
   125  			self.Set("IsRoot", (usr.Role == -1000))
   126  			self.Set("SignedUser", usr)
   127  			self.Set("SignedUserID", usr.Id)
   128  			self.Set("SignedUserName", usr.Username)
   129  			cc.Set(fmt.Sprintf("SignedUser:%v", usr.Id), usr, 60*60*24)
   130  			models.PutSignin2User(usr.Id, time.Now().Unix(), usr.SigninCount+1, self.RealIP())
   131  
   132  			//设置cookie
   133  			cookie := self.NewCookie()
   134  			cookie.Name = "remember"
   135  			if remember == "true" {
   136  				cookie.Value = "true"
   137  				cookie.Expires = (time.Now().Add(time.Duration(31190400))) //361 days
   138  				//使用flower作本地存储时的Email别名
   139  				//self.SetSuperSecureCookie(Secret, "flower", usr.Email, 31190400)
   140  			} else {
   141  				cookie.Value = ("false") //取消记录
   142  				cookie.Expires = (time.Now().Add(time.Duration(-1)))
   143  				//self.SetSuperSecureCookie(Secret, "flower", "", 3600) //删除数据
   144  			}
   145  			self.SetCookie(cookie)
   146  
   147  			if next := self.Args("next").String(); next != "" {
   148  				return self.Redirect(next)
   149  			}
   150  			return self.Redirect("/")
   151  
   152  		} else {
   153  			self.Flash.Error("密码无法通过校验~")
   154  			goto render
   155  		}
   156  	} else {
   157  		self.Flash.Error("该账号不存在~")
   158  		goto render
   159  	}
   160  render:
   161  	return self.Render(TplNames)
   162  }