支持多家云存储的云盘系统
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

56 lines
1.6 KiB

6 years ago
6 years ago
6 years ago
6 years ago
  1. package middleware
  2. import (
  3. "github.com/cloudreve/Cloudreve/v3/pkg/conf"
  4. "github.com/cloudreve/Cloudreve/v3/pkg/serializer"
  5. "github.com/cloudreve/Cloudreve/v3/pkg/util"
  6. "github.com/gin-contrib/sessions"
  7. "github.com/gin-contrib/sessions/memstore"
  8. "github.com/gin-contrib/sessions/redis"
  9. "github.com/gin-gonic/gin"
  10. )
  11. // Store session存储
  12. var Store memstore.Store
  13. // Session 初始化session
  14. func Session(secret string) gin.HandlerFunc {
  15. // Redis设置不为空,且非测试模式时使用Redis
  16. if conf.RedisConfig.Server != "" && gin.Mode() != gin.TestMode {
  17. var err error
  18. Store, err = redis.NewStoreWithDB(10, conf.RedisConfig.Network, conf.RedisConfig.Server, conf.RedisConfig.Password, conf.RedisConfig.DB, []byte(secret))
  19. if err != nil {
  20. util.Log().Panic("无法连接到 Redis:%s", err)
  21. }
  22. util.Log().Info("已连接到 Redis 服务器:%s", conf.RedisConfig.Server)
  23. } else {
  24. Store = memstore.NewStore([]byte(secret))
  25. }
  26. // Also set Secure: true if using SSL, you should though
  27. // TODO:same-site policy
  28. Store.Options(sessions.Options{HttpOnly: true, MaxAge: 7 * 86400, Path: "/"})
  29. return sessions.Sessions("cloudreve-session", Store)
  30. }
  31. // CSRFInit 初始化CSRF标记
  32. func CSRFInit() gin.HandlerFunc {
  33. return func(c *gin.Context) {
  34. util.SetSession(c, map[string]interface{}{"CSRF": true})
  35. c.Next()
  36. }
  37. }
  38. // CSRFCheck 检查CSRF标记
  39. func CSRFCheck() gin.HandlerFunc {
  40. return func(c *gin.Context) {
  41. if check, ok := util.GetSession(c, "CSRF").(bool); ok && check {
  42. c.Next()
  43. return
  44. }
  45. c.JSON(200, serializer.Err(serializer.CodeNoPermissionErr, "来源非法", nil))
  46. c.Abort()
  47. }
  48. }