Як керувати сеансами в Golang за допомогою Gin Framework та Redis?

Alex Alex 24 листопада 2020
Як керувати сеансами в Golang за допомогою Gin Framework та Redis?

Перш ніж ми почнемо писати код для управління сесіями в Golang, обговорімо, що таке управління сесіями та чому це важливо?

Що таке управління сесіями?

Управління сесіями - це процес фіксації статусу користувача під час взаємодії з нашим застосунком. Як правило, веб-програма зберігає сеанси підключеного користувача з нашим застосунком. Ми всі помічали відстеження сеансів під час використання вебсайтів. Стан сесії пам’ятає, коли ми реєстрували свої облікові дані, інформацію про кошик у застосунках для електронної комерції, способи оплати, тощо.

Тож управління сесіями є ключовим фактором для будь-якого розробника програмного забезпечення. Коли сесія працює, програма читає та записує виключно в сховища сеансів, що зберігаються в пам'яті. Це також робить наш застосунок надзвичайно швидким та ефективним. Стан сеансу може бути змінним або постійним. Залежно від чутливості даних він може бути постійним або змінним.

Наприклад, історія може бути нестабільною, але ваші платіжні транзакції та інформація про кошик повинні зберігатися постійно.

Сеанс зберігає дані у парі ключ-значення де користувач знає цей ключ, що дозволяє користувачам отримувати доступ лише до своїх даних.

Golang (Gin framework) підтримує програмне забезпечення для управління різними серверними сесіями. Вони пропонують

  1. Сесії на основі файлів cookie
  2. Redis
  3. memcached
  4. MongoDB
  5. memstore

Чому Redis?

  1. Redis базується на симетричній архітектурі без спільних даних, яка дозволяє лінійно масштабуватися без зміни коду.
  2. Пропонує кілька моделей високої доступності та географічного розподілу, що забезпечує місцеві затримки.
  3. Безліч варіантів стійкості, що не покращує ефективність нашої програми.
  4. Підтримує великий обсяг набору даних.

Тепер реалізуймо сесію в Golang за допомогою Redis.

Спочатку налаштуємо наше середовище. Зайдіть і створіть теку, я назвав її як session-redis-go. Всередині цієї теки створіть теку bin, src та pkg та створіть файл main.go. Тепер відкрийте свій проєкт у редакторі. Для ініціалізації проєкту використовуйте команду

 go mod init session-redis
Структура папки
Структура каталогів

Тепер встановіть gin-gonic (фреймворк Golang у нашому застосунку). Використовуйте команду:

$ go get -u github.com/gin-gonic/gin

Далі нам потрібно встановити пакет сеансу:

$ go get github.com/gin-contrib/sessions

Після встановлення цих двох пакетів ми готові до роботи.

Тепер протестуймо наш застосунок. У файлі main.go

package mainimport "github.com/gin-gonic/gin"func main() {
r := gin.Default()
r.GET("/test", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": "Testing Success",
})
})
r.Run()}

Запустіть свій проєкт:

go run main.go

Відкрийте адресу http://localhost:8080/test

Зображення для публікації
Проєкт тестування

Ми можемо успішно запустити наш застосунок.

Тепер створіть теку  middlerware всередині теки src та. Всередині теки middlerware створіть файл auth.go.

Усередині файлу auth.go помістіть нижче код:

package middleware

import (
	"github.com/gin-contrib/sessions"
	"github.com/gin-gonic/gin"
	"net/http"
)

func Authentication() gin.HandlerFunc {
	return func(c *gin.Context) {
		session := sessions.Default(c)
		sessionID := session.Get("id")
		if sessionID == nil {
			c.JSON(http.StatusNotFound, gin.H{
				"message": "unauthorized",
			})
			c.Abort()
		}
	}

Дозвольте пояснити цей код:

Тут ми створюємо функцію проміжного програмного забезпечення, яка називається Authentication; ми використовували пакет сеансів для отримання даних сеансу під час автентифікації. Якщо ідентифікатора користувача немає, наша програма буде зупинена, показуючи повідомлення про несанкціонований доступ.

Тепер нам потрібно створити два контролери для додавання сесії та знищення сеансу. Перейдіть до теки src, створіть теку controller, а в ній файл  auth.go

package controller

import (
	"github.com/gin-contrib/sessions"
	"github.com/gin-gonic/gin"
	"net/http"
)

func Login(c *gin.Context) {
	session := sessions.Default(c)
	session.Set("id", 12090292)
	session.Set("email", "[email protected]")
	session.Save()
	c.JSON(http.StatusOK, gin.H{
		"message": "User Sign In successfully",
	})
}
func Logout(c *gin.Context) {
	session := sessions.Default(c)
	session.Clear()
	session.Save()
	c.JSON(http.StatusOK, gin.H{
		"message": "User Sign out successfully",
	})
}

У наведеному вище коді я створив дві функції Login() та Logout(). В Login  після успішного входу в сесії зберігається ідентифікатор та електронна адреса користувача. Під час виходу я видаляю цю інформацію та зберігаю інформацію про сеанс.

Тепер нам потрібно використовувати Redis для збереження нашої сесії. Для цього нам потрібно змінити наш файл main.go.

package main

import (
	"github.com/gin-contrib/sessions"
	"github.com/gin-contrib/sessions/redis"
	"github.com/gin-gonic/gin"
	"session-redis/src/controller"
	"session-redis/src/middleware"
)

func main() {
	r := gin.Default()
	store, _ := redis.NewStore(10, "tcp", "localhost:6379", "", []byte("secret"))
	r.Use(sessions.Sessions("mysession", store))
	r.POST("/login", controller.Login)
	r.GET("/logout", controller.Logout)
	auth := r.Group("/auth")
	auth.Use(middleware.Authentication())
	{
		auth.GET("/test", func(c *gin.Context) {
			c.JSON(200, gin.H{
				"message": "Everything is ok",
			})
		})
	}
	r.Run(":8000")
}

У цьому коді я налаштував redis store для зберігання моїх сеансів. Я визначив назву сесії - це mysession. Створив два API для /login та /logout. Я використовую тут middleware, щоб перевірити, чи ввійшов користувач у систему чи ні. Якщо користувач увійшов в систему, він пройшов ідентифікацію, щоб використовувати /test, інакше ні.

Перш ніж запускати програму, ми повинні переконатися, що ми встановили сервер redis і він працює у порту 6379. Щоб дізнатися, як його встановити, відвідайте https://redis.io/

Для користувачів Ubuntu ви можете використовувати такі команди:

sudo apt update
sudo apt install redis-server

Щоб перевірити статус сервера:

sudo systemctl status redis-server

Налаштуйте redis, щоб приймати з’єднання від вашої програми:

sudo nano /etc/redis/redis.conf

Перезапустіть сервер, щоб побачити зміни:

sudo systemctl restart redis-server

Щоб перевірити, чи слухає він порту 6379:

ss -an | grep 6379

Настав час запустити наш застосунок:
Введіть наступну команду в наш термінал.

go run main.go

Відрийте адресу http://localhost:8000/auth/test браузері або Postman:

Результат очікуваний, оскільки ми не увійшли в систему, тому ми не авторизовані.

Зображення для публікації

Тепер введіть: http://localhost:8000/login

Зображення для публікації

Ми ввійшли успішно в систему :

Тепер знову перейдіть за адресою http://localhost:8000/auth/test

Зображення для публікації

Для завершення сесій скористайтеся методом /logout.

Оскільки Redis - це дуже популярна платформа для зберігання даних сеансів. Golang забезпечує простий та ефективний спосіб використання redis у нашому Golang застосунку.

Весь код можна знайти на Github: https://github.com/Bikash888/session-redis-golang

Джерело: How To Manage Your Sessions in Golang using Gin Framework And Redis?

Коментарі (0)

    Ще немає коментарів

Щоб залишити коментар необхідно авторизуватися.

Війти / Зареєструватися