gtsocial-umbx

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

README.md (9562B)


      1 # sessions
      2 
      3 [![Run CI Lint](https://github.com/gin-contrib/sessions/actions/workflows/lint.yml/badge.svg)](https://github.com/gin-contrib/sessions/actions/workflows/lint.yml)
      4 [![Run Testing](https://github.com/gin-contrib/sessions/actions/workflows/testing.yml/badge.svg)](https://github.com/gin-contrib/sessions/actions/workflows/testing.yml)
      5 [![codecov](https://codecov.io/gh/gin-contrib/sessions/branch/master/graph/badge.svg)](https://codecov.io/gh/gin-contrib/sessions)
      6 [![Go Report Card](https://goreportcard.com/badge/github.com/gin-contrib/sessions)](https://goreportcard.com/report/github.com/gin-contrib/sessions)
      7 [![GoDoc](https://godoc.org/github.com/gin-contrib/sessions?status.svg)](https://godoc.org/github.com/gin-contrib/sessions)
      8 [![Join the chat at https://gitter.im/gin-gonic/gin](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/gin-gonic/gin)
      9 
     10 Gin middleware for session management with multi-backend support:
     11 
     12 - [cookie-based](#cookie-based)
     13 - [Redis](#redis)
     14 - [memcached](#memcached)
     15 - [MongoDB](#mongodb)
     16 - [GoRM](#gorm)
     17 - [memstore](#memstore)
     18 - [PostgreSQL](#postgresql)
     19 
     20 ## Usage
     21 
     22 ### Start using it
     23 
     24 Download and install it:
     25 
     26 ```bash
     27 go get github.com/gin-contrib/sessions
     28 ```
     29 
     30 Import it in your code:
     31 
     32 ```go
     33 import "github.com/gin-contrib/sessions"
     34 ```
     35 
     36 ## Basic Examples
     37 
     38 ### single session
     39 
     40 ```go
     41 package main
     42 
     43 import (
     44   "github.com/gin-contrib/sessions"
     45   "github.com/gin-contrib/sessions/cookie"
     46   "github.com/gin-gonic/gin"
     47 )
     48 
     49 func main() {
     50   r := gin.Default()
     51   store := cookie.NewStore([]byte("secret"))
     52   r.Use(sessions.Sessions("mysession", store))
     53 
     54   r.GET("/hello", func(c *gin.Context) {
     55     session := sessions.Default(c)
     56 
     57     if session.Get("hello") != "world" {
     58       session.Set("hello", "world")
     59       session.Save()
     60     }
     61 
     62     c.JSON(200, gin.H{"hello": session.Get("hello")})
     63   })
     64   r.Run(":8000")
     65 }
     66 ```
     67 
     68 ### multiple sessions
     69 
     70 ```go
     71 package main
     72 
     73 import (
     74   "github.com/gin-contrib/sessions"
     75   "github.com/gin-contrib/sessions/cookie"
     76   "github.com/gin-gonic/gin"
     77 )
     78 
     79 func main() {
     80   r := gin.Default()
     81   store := cookie.NewStore([]byte("secret"))
     82   sessionNames := []string{"a", "b"}
     83   r.Use(sessions.SessionsMany(sessionNames, store))
     84 
     85   r.GET("/hello", func(c *gin.Context) {
     86     sessionA := sessions.DefaultMany(c, "a")
     87     sessionB := sessions.DefaultMany(c, "b")
     88 
     89     if sessionA.Get("hello") != "world!" {
     90       sessionA.Set("hello", "world!")
     91       sessionA.Save()
     92     }
     93 
     94     if sessionB.Get("hello") != "world?" {
     95       sessionB.Set("hello", "world?")
     96       sessionB.Save()
     97     }
     98 
     99     c.JSON(200, gin.H{
    100       "a": sessionA.Get("hello"),
    101       "b": sessionB.Get("hello"),
    102     })
    103   })
    104   r.Run(":8000")
    105 }
    106 ```
    107 
    108 ## Backend Examples
    109 
    110 ### cookie-based
    111 
    112 ```go
    113 package main
    114 
    115 import (
    116   "github.com/gin-contrib/sessions"
    117   "github.com/gin-contrib/sessions/cookie"
    118   "github.com/gin-gonic/gin"
    119 )
    120 
    121 func main() {
    122   r := gin.Default()
    123   store := cookie.NewStore([]byte("secret"))
    124   r.Use(sessions.Sessions("mysession", store))
    125 
    126   r.GET("/incr", func(c *gin.Context) {
    127     session := sessions.Default(c)
    128     var count int
    129     v := session.Get("count")
    130     if v == nil {
    131       count = 0
    132     } else {
    133       count = v.(int)
    134       count++
    135     }
    136     session.Set("count", count)
    137     session.Save()
    138     c.JSON(200, gin.H{"count": count})
    139   })
    140   r.Run(":8000")
    141 }
    142 ```
    143 
    144 ### Redis
    145 
    146 ```go
    147 package main
    148 
    149 import (
    150   "github.com/gin-contrib/sessions"
    151   "github.com/gin-contrib/sessions/redis"
    152   "github.com/gin-gonic/gin"
    153 )
    154 
    155 func main() {
    156   r := gin.Default()
    157   store, _ := redis.NewStore(10, "tcp", "localhost:6379", "", []byte("secret"))
    158   r.Use(sessions.Sessions("mysession", store))
    159 
    160   r.GET("/incr", func(c *gin.Context) {
    161     session := sessions.Default(c)
    162     var count int
    163     v := session.Get("count")
    164     if v == nil {
    165       count = 0
    166     } else {
    167       count = v.(int)
    168       count++
    169     }
    170     session.Set("count", count)
    171     session.Save()
    172     c.JSON(200, gin.H{"count": count})
    173   })
    174   r.Run(":8000")
    175 }
    176 ```
    177 
    178 ### Memcached
    179 
    180 #### ASCII Protocol
    181 
    182 ```go
    183 package main
    184 
    185 import (
    186   "github.com/bradfitz/gomemcache/memcache"
    187   "github.com/gin-contrib/sessions"
    188   "github.com/gin-contrib/sessions/memcached"
    189   "github.com/gin-gonic/gin"
    190 )
    191 
    192 func main() {
    193   r := gin.Default()
    194   store := memcached.NewStore(memcache.New("localhost:11211"), "", []byte("secret"))
    195   r.Use(sessions.Sessions("mysession", store))
    196 
    197   r.GET("/incr", func(c *gin.Context) {
    198     session := sessions.Default(c)
    199     var count int
    200     v := session.Get("count")
    201     if v == nil {
    202       count = 0
    203     } else {
    204       count = v.(int)
    205       count++
    206     }
    207     session.Set("count", count)
    208     session.Save()
    209     c.JSON(200, gin.H{"count": count})
    210   })
    211   r.Run(":8000")
    212 }
    213 ```
    214 
    215 #### Binary protocol (with optional SASL authentication)
    216 
    217 ```go
    218 package main
    219 
    220 import (
    221   "github.com/gin-contrib/sessions"
    222   "github.com/gin-contrib/sessions/memcached"
    223   "github.com/gin-gonic/gin"
    224   "github.com/memcachier/mc"
    225 )
    226 
    227 func main() {
    228   r := gin.Default()
    229   client := mc.NewMC("localhost:11211", "username", "password")
    230   store := memcached.NewMemcacheStore(client, "", []byte("secret"))
    231   r.Use(sessions.Sessions("mysession", store))
    232 
    233   r.GET("/incr", func(c *gin.Context) {
    234     session := sessions.Default(c)
    235     var count int
    236     v := session.Get("count")
    237     if v == nil {
    238       count = 0
    239     } else {
    240       count = v.(int)
    241       count++
    242     }
    243     session.Set("count", count)
    244     session.Save()
    245     c.JSON(200, gin.H{"count": count})
    246   })
    247   r.Run(":8000")
    248 }
    249 ```
    250 
    251 ### MongoDB
    252 
    253 #### mgo
    254 ```go
    255 package main
    256 
    257 import (
    258   "github.com/gin-contrib/sessions"
    259   "github.com/gin-contrib/sessions/mongo/mongomgo"
    260   "github.com/gin-gonic/gin"
    261   "github.com/globalsign/mgo"
    262 )
    263 
    264 func main() {
    265   r := gin.Default()
    266   session, err := mgo.Dial("localhost:27017/test")
    267   if err != nil {
    268     // handle err
    269   }
    270 
    271   c := session.DB("").C("sessions")
    272   store := mongomgo.NewStore(c, 3600, true, []byte("secret"))
    273   r.Use(sessions.Sessions("mysession", store))
    274 
    275   r.GET("/incr", func(c *gin.Context) {
    276     session := sessions.Default(c)
    277     var count int
    278     v := session.Get("count")
    279     if v == nil {
    280       count = 0
    281     } else {
    282       count = v.(int)
    283       count++
    284     }
    285     session.Set("count", count)
    286     session.Save()
    287     c.JSON(200, gin.H{"count": count})
    288   })
    289   r.Run(":8000")
    290 }
    291 ```
    292 
    293 #### mongo-driver
    294 ```
    295 package main
    296 
    297 import (
    298   "context"
    299   "github.com/gin-contrib/sessions"
    300   "github.com/gin-contrib/sessions/mongo/mongodriver"
    301   "github.com/gin-gonic/gin"
    302   "go.mongodb.org/mongo-driver/mongo"
    303   "go.mongodb.org/mongo-driver/mongo/options"
    304 )
    305 
    306 func main() {
    307   r := gin.Default()
    308   mongoOptions := options.Client().ApplyURI("mongodb://localhost:27017")
    309   client, err := mongo.NewClient(mongoOptions)
    310   if err != nil {
    311     // handle err
    312   }
    313 
    314   if err := client.Connect(context.Background()); err != nil {
    315     // handle err
    316   }
    317 
    318   c := client.Database("test").Collection("sessions")
    319   store := mongodriver.NewStore(c, 3600, true, []byte("secret"))
    320   r.Use(sessions.Sessions("mysession", store))
    321 
    322   r.GET("/incr", func(c *gin.Context) {
    323     session := sessions.Default(c)
    324     var count int
    325     v := session.Get("count")
    326     if v == nil {
    327       count = 0
    328     } else {
    329       count = v.(int)
    330       count++
    331     }
    332     session.Set("count", count)
    333     session.Save()
    334     c.JSON(200, gin.H{"count": count})
    335   })
    336   r.Run(":8000")
    337 }
    338 ```
    339 
    340 ### memstore
    341 
    342 ```go
    343 package main
    344 
    345 import (
    346   "github.com/gin-contrib/sessions"
    347   "github.com/gin-contrib/sessions/memstore"
    348   "github.com/gin-gonic/gin"
    349 )
    350 
    351 func main() {
    352   r := gin.Default()
    353   store := memstore.NewStore([]byte("secret"))
    354   r.Use(sessions.Sessions("mysession", store))
    355 
    356   r.GET("/incr", func(c *gin.Context) {
    357     session := sessions.Default(c)
    358     var count int
    359     v := session.Get("count")
    360     if v == nil {
    361       count = 0
    362     } else {
    363       count = v.(int)
    364       count++
    365     }
    366     session.Set("count", count)
    367     session.Save()
    368     c.JSON(200, gin.H{"count": count})
    369   })
    370   r.Run(":8000")
    371 }
    372 ```
    373 
    374 ### GoRM
    375 
    376 [embedmd]:# (_example/gorm/main.go go)
    377 ```go
    378 package main
    379 
    380 import (
    381   "github.com/gin-contrib/sessions"
    382   gormsessions "github.com/gin-contrib/sessions/gorm"
    383   "github.com/gin-gonic/gin"
    384   "gorm.io/driver/sqlite"
    385   "gorm.io/gorm"
    386 )
    387 
    388 func main() {
    389   db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
    390   if err != nil {
    391     panic(err)
    392   }
    393   store := gormsessions.NewStore(db, true, []byte("secret"))
    394 
    395   r := gin.Default()
    396   r.Use(sessions.Sessions("mysession", store))
    397 
    398   r.GET("/incr", func(c *gin.Context) {
    399     session := sessions.Default(c)
    400     var count int
    401     v := session.Get("count")
    402     if v == nil {
    403       count = 0
    404     } else {
    405       count = v.(int)
    406       count++
    407     }
    408     session.Set("count", count)
    409     session.Save()
    410     c.JSON(200, gin.H{"count": count})
    411   })
    412   r.Run(":8000")
    413 }
    414 ```
    415 
    416 ### PostgreSQL
    417 
    418 ```go
    419 package main
    420 
    421 import (
    422   "database/sql"
    423   "github.com/gin-contrib/sessions"
    424   "github.com/gin-contrib/sessions/postgres"
    425   "github.com/gin-gonic/gin"
    426 )
    427 
    428 func main() {
    429   r := gin.Default()
    430   db, err := sql.Open("postgres", "postgresql://username:password@localhost:5432/database")
    431   if err != nil {
    432     // handle err
    433   }
    434 
    435   store, err := postgres.NewStore(db, []byte("secret"))
    436   if err != nil {
    437     // handle err
    438   }
    439 
    440   r.Use(sessions.Sessions("mysession", store))
    441 
    442   r.GET("/incr", func(c *gin.Context) {
    443     session := sessions.Default(c)
    444     var count int
    445     v := session.Get("count")
    446     if v == nil {
    447       count = 0
    448     } else {
    449       count = v.(int)
    450       count++
    451     }
    452     session.Set("count", count)
    453     session.Save()
    454     c.JSON(200, gin.H{"count": count})
    455   })
    456   r.Run(":8000")
    457 }
    458 ```