Перш ніж ми почнемо писати код для управління сесіями в Golang, обговорімо, що таке управління сесіями та чому це важливо?
Що таке управління сесіями?
Управління сесіями - це процес фіксації статусу користувача під час взаємодії з нашим застосунком. Як правило, веб-програма зберігає сеанси підключеного користувача з нашим застосунком. Ми всі помічали відстеження сеансів під час використання вебсайтів. Стан сесії пам’ятає, коли ми реєстрували свої облікові дані, інформацію про кошик у застосунках для електронної комерції, способи оплати, тощо.
Тож управління сесіями є ключовим фактором для будь-якого розробника програмного забезпечення. Коли сесія працює, програма читає та записує виключно в сховища сеансів, що зберігаються в пам'яті. Це також робить наш застосунок надзвичайно швидким та ефективним. Стан сеансу може бути змінним або постійним. Залежно від чутливості даних він може бути постійним або змінним.
Наприклад, історія може бути нестабільною, але ваші платіжні транзакції та інформація про кошик повинні зберігатися постійно.
Сеанс зберігає дані у парі ключ-значення де користувач знає цей ключ, що дозволяє користувачам отримувати доступ лише до своїх даних.
Golang (Gin framework) підтримує програмне забезпечення для управління різними серверними сесіями. Вони пропонують
- Сесії на основі файлів cookie
- Redis
- memcached
- MongoDB
- memstore
Чому Redis?
- Redis базується на симетричній архітектурі без спільних даних, яка дозволяє лінійно масштабуватися без зміни коду.
- Пропонує кілька моделей високої доступності та географічного розподілу, що забезпечує місцеві затримки.
- Безліч варіантів стійкості, що не покращує ефективність нашої програми.
- Підтримує великий обсяг набору даних.
Тепер реалізуймо сесію в 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
; ми використовували пакет сеансів для отримання даних сеансу під час автентифікації. Якщо ідентифікатора користувача немає, наша програма буде зупинена, показуючи повідомлення про несанкціонований доступ.
Читайте також: 5 речей які слід знати перед розгортанням MongoDB
Тепер нам потрібно створити два контролери для додавання сесії та знищення сеансу. Перейдіть до теки 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", "test@gmail.com") 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?
Ще немає коментарів