servicecontext.go 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. package svc
  2. import (
  3. "perms-system-server/internal/config"
  4. "perms-system-server/internal/loaders"
  5. "perms-system-server/internal/middleware"
  6. "perms-system-server/internal/model"
  7. "github.com/minio/minio-go/v7"
  8. "github.com/minio/minio-go/v7/pkg/credentials"
  9. "github.com/zeromicro/go-zero/core/limit"
  10. "github.com/zeromicro/go-zero/core/logx"
  11. "github.com/zeromicro/go-zero/core/stores/redis"
  12. "github.com/zeromicro/go-zero/core/stores/sqlx"
  13. "github.com/zeromicro/go-zero/rest"
  14. )
  15. type ServiceContext struct {
  16. Config config.Config
  17. JwtAuth rest.Middleware
  18. ProductLoginRateLimit rest.Middleware
  19. AdminLoginRateLimit rest.Middleware
  20. SyncRateLimit rest.Middleware
  21. RefreshTokenRateLimit rest.Middleware
  22. GrpcLoginLimiter *limit.PeriodLimit
  23. GrpcRefreshLimiter *limit.PeriodLimit
  24. GrpcVerifyLimiter *limit.PeriodLimit
  25. GrpcSyncLimiter *limit.PeriodLimit
  26. GrpcGetUserPermsLimiter *limit.PeriodLimit
  27. UsernameLoginLimit *limit.PeriodLimit
  28. TokenOpLimiter *limit.PeriodLimit
  29. UserDetailsLoader *loaders.UserDetailsLoader
  30. Redis *redis.Redis
  31. MinioClient *minio.Client
  32. *model.Models
  33. }
  34. func NewServiceContext(c config.Config) *ServiceContext {
  35. conn := sqlx.NewMysql(c.MySQL.DataSource)
  36. rds := redis.MustNewRedis(c.CacheRedis.Nodes[0].RedisConf)
  37. models := model.NewModels(conn, c.CacheRedis.Nodes, c.CacheRedis.KeyPrefix)
  38. udLoader := loaders.NewUserDetailsLoader(rds, c.CacheRedis.KeyPrefix, models)
  39. productLoginRL := middleware.NewProductLoginRateLimitMiddleware(rds, c.CacheRedis.KeyPrefix, c.BehindProxy)
  40. adminLoginRL := middleware.NewAdminLoginRateLimitMiddleware(rds, c.CacheRedis.KeyPrefix, c.BehindProxy)
  41. syncRlMiddleware := middleware.NewSyncRateLimitMiddleware(rds, c.CacheRedis.KeyPrefix, c.BehindProxy)
  42. refreshTokenRL := middleware.NewRefreshTokenRateLimitMiddleware(rds, c.CacheRedis.KeyPrefix, c.BehindProxy)
  43. grpcLimiter := limit.NewPeriodLimit(60, 20, rds, c.CacheRedis.KeyPrefix+":rl:grpc:login")
  44. // gRPC refreshToken 一般低频操作(分钟级),限紧一点可以同时防签名爆破与并发刷新被用作会话劫持的放大器。
  45. grpcRefreshLimiter := limit.NewPeriodLimit(60, 30, rds, c.CacheRedis.KeyPrefix+":rl:grpc:refresh")
  46. // gRPC verifyToken 是下游每请求都会调用的热路径,阈值必须足够高;这里的作用是兜底防止下游被攻破后把权限中心当 token oracle 爆破。
  47. grpcVerifyLimiter := limit.NewPeriodLimit(60, 6000, rds, c.CacheRedis.KeyPrefix+":rl:grpc:verify")
  48. // 审计 M-R11-1:gRPC SyncPermissions / GetUserPerms 原来没有入口限流,而 HTTP 侧 /api/perm/sync
  49. // 已经挂 SyncRateLimit。限流 key 走 appKey 维度,避免按 IP 把"同一产品不同后端实例共享 egress"
  50. // 整组误伤。桶位按单产品实际节奏给出:单产品每分钟 60 次同步足以覆盖多实例并发发版的真实用量,
  51. // GetUserPerms 1000 次/分钟/产品覆盖多实例冷启动预热峰值,而 appSecret 泄露时能把放大系数压回
  52. // 可控量级。
  53. grpcSyncLimiter := limit.NewPeriodLimit(60, 60, rds, c.CacheRedis.KeyPrefix+":rl:grpc:sync")
  54. grpcGetUserPermsLimiter := limit.NewPeriodLimit(60, 1000, rds, c.CacheRedis.KeyPrefix+":rl:grpc:perms")
  55. usernameLimiter := limit.NewPeriodLimit(300, 10, rds, c.CacheRedis.KeyPrefix+":rl:user")
  56. tokenOpLimiter := limit.NewPeriodLimit(60, 10, rds, c.CacheRedis.KeyPrefix+":rl:tokenop")
  57. var minioClient *minio.Client
  58. if c.Minio.Endpoint != "" {
  59. var err error
  60. minioClient, err = minio.New(c.Minio.Endpoint, &minio.Options{
  61. Creds: credentials.NewStaticV4(c.Minio.AccessKeyId, c.Minio.AccessKeySecret, ""),
  62. Secure: c.Minio.UseSSL,
  63. })
  64. if err != nil {
  65. logx.Must(err)
  66. }
  67. }
  68. return &ServiceContext{
  69. Config: c,
  70. JwtAuth: middleware.NewJwtAuthMiddleware(c.Auth.AccessSecret, udLoader).Handle,
  71. ProductLoginRateLimit: productLoginRL.Handle,
  72. AdminLoginRateLimit: adminLoginRL.Handle,
  73. SyncRateLimit: syncRlMiddleware.Handle,
  74. RefreshTokenRateLimit: refreshTokenRL.Handle,
  75. GrpcLoginLimiter: grpcLimiter,
  76. GrpcRefreshLimiter: grpcRefreshLimiter,
  77. GrpcVerifyLimiter: grpcVerifyLimiter,
  78. GrpcSyncLimiter: grpcSyncLimiter,
  79. GrpcGetUserPermsLimiter: grpcGetUserPermsLimiter,
  80. UsernameLoginLimit: usernameLimiter,
  81. TokenOpLimiter: tokenOpLimiter,
  82. UserDetailsLoader: udLoader,
  83. Redis: rds,
  84. MinioClient: minioClient,
  85. Models: models,
  86. }
  87. }