credential_manager.go 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. package credential
  2. import (
  3. "context"
  4. "fmt"
  5. "strings"
  6. "github.com/seaweedfs/seaweedfs/weed/pb/iam_pb"
  7. "github.com/seaweedfs/seaweedfs/weed/util"
  8. )
  9. // CredentialManager manages user credentials using a configurable store
  10. type CredentialManager struct {
  11. store CredentialStore
  12. }
  13. // NewCredentialManager creates a new credential manager with the specified store
  14. func NewCredentialManager(storeName CredentialStoreTypeName, configuration util.Configuration, prefix string) (*CredentialManager, error) {
  15. var store CredentialStore
  16. // Find the requested store implementation
  17. for _, s := range Stores {
  18. if s.GetName() == storeName {
  19. store = s
  20. break
  21. }
  22. }
  23. if store == nil {
  24. return nil, fmt.Errorf("credential store '%s' not found. Available stores: %s",
  25. storeName, getAvailableStores())
  26. }
  27. // Initialize the store
  28. if err := store.Initialize(configuration, prefix); err != nil {
  29. return nil, fmt.Errorf("failed to initialize credential store '%s': %v", storeName, err)
  30. }
  31. return &CredentialManager{
  32. store: store,
  33. }, nil
  34. }
  35. // GetStore returns the underlying credential store
  36. func (cm *CredentialManager) GetStore() CredentialStore {
  37. return cm.store
  38. }
  39. // LoadConfiguration loads the S3 API configuration
  40. func (cm *CredentialManager) LoadConfiguration(ctx context.Context) (*iam_pb.S3ApiConfiguration, error) {
  41. return cm.store.LoadConfiguration(ctx)
  42. }
  43. // SaveConfiguration saves the S3 API configuration
  44. func (cm *CredentialManager) SaveConfiguration(ctx context.Context, config *iam_pb.S3ApiConfiguration) error {
  45. return cm.store.SaveConfiguration(ctx, config)
  46. }
  47. // CreateUser creates a new user
  48. func (cm *CredentialManager) CreateUser(ctx context.Context, identity *iam_pb.Identity) error {
  49. return cm.store.CreateUser(ctx, identity)
  50. }
  51. // GetUser retrieves a user by username
  52. func (cm *CredentialManager) GetUser(ctx context.Context, username string) (*iam_pb.Identity, error) {
  53. return cm.store.GetUser(ctx, username)
  54. }
  55. // UpdateUser updates an existing user
  56. func (cm *CredentialManager) UpdateUser(ctx context.Context, username string, identity *iam_pb.Identity) error {
  57. return cm.store.UpdateUser(ctx, username, identity)
  58. }
  59. // DeleteUser removes a user
  60. func (cm *CredentialManager) DeleteUser(ctx context.Context, username string) error {
  61. return cm.store.DeleteUser(ctx, username)
  62. }
  63. // ListUsers returns all usernames
  64. func (cm *CredentialManager) ListUsers(ctx context.Context) ([]string, error) {
  65. return cm.store.ListUsers(ctx)
  66. }
  67. // GetUserByAccessKey retrieves a user by access key
  68. func (cm *CredentialManager) GetUserByAccessKey(ctx context.Context, accessKey string) (*iam_pb.Identity, error) {
  69. return cm.store.GetUserByAccessKey(ctx, accessKey)
  70. }
  71. // CreateAccessKey creates a new access key for a user
  72. func (cm *CredentialManager) CreateAccessKey(ctx context.Context, username string, credential *iam_pb.Credential) error {
  73. return cm.store.CreateAccessKey(ctx, username, credential)
  74. }
  75. // DeleteAccessKey removes an access key for a user
  76. func (cm *CredentialManager) DeleteAccessKey(ctx context.Context, username string, accessKey string) error {
  77. return cm.store.DeleteAccessKey(ctx, username, accessKey)
  78. }
  79. // Shutdown performs cleanup
  80. func (cm *CredentialManager) Shutdown() {
  81. if cm.store != nil {
  82. cm.store.Shutdown()
  83. }
  84. }
  85. // getAvailableStores returns a comma-separated list of available store names
  86. func getAvailableStores() string {
  87. var storeNames []string
  88. for _, store := range Stores {
  89. storeNames = append(storeNames, string(store.GetName()))
  90. }
  91. return strings.Join(storeNames, ", ")
  92. }
  93. // GetAvailableStores returns a list of available credential store names
  94. func GetAvailableStores() []CredentialStoreTypeName {
  95. var storeNames []CredentialStoreTypeName
  96. for _, store := range Stores {
  97. storeNames = append(storeNames, store.GetName())
  98. }
  99. if storeNames == nil {
  100. return []CredentialStoreTypeName{}
  101. }
  102. return storeNames
  103. }