// Login выполняет авторизацию пользователей. // Если введенные имя и пароль действительны, Login запишет факт авторизации // в сессию пользователя и вернет первым значением структуру пользователя, // а вторым true. В противном случае - nil и false. // Login перезапишет старые данные об авторизации, если таковые имеются. func Login(c *gin.Context, name string, password string) (*User, bool) { user := &User{} err := models.DB.Where("name = ?", name).First(user).Error if err != nil { return nil, false } if hashPwd(password) != user.PwdHash { return nil, false } st := session.FromContext(c) st.SetInt("user_id", int(user.ID)) return user, true }
// FromContext получает данные об авторизации из сессии пользователя. // Если пользователь авторизован, FromContext вернет структуру и true. // Иначе nil и false. func FromContext(c *gin.Context) (*User, bool) { st := session.FromContext(c) if st.GetInt("user_id") == 0 { return nil, false } userid := uint(st.GetInt("user_id")) user := &User{} err := models.DB.Find(user, userid).Error if err != nil { return nil, false } user.MarkVisit() return user, true }
// Logout стирает данные об авторизации из сессии пользователя. func Logout(c *gin.Context) { st := session.FromContext(c) st.SetInt("user_id", 0) }
// AutoLogin запишет факт авторизации в сессию пользователя. // Он перезапишет старые данные об авторизации, если таковые имеются. func (u *User) AutoLogin(c *gin.Context) { st := session.FromContext(c) st.SetInt("user_id", int(u.ID)) }