aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Lu <chrislusf@users.noreply.github.com>2025-12-12 14:45:23 -0800
committerGitHub <noreply@github.com>2025-12-12 14:45:23 -0800
commit6fb3ec968d64e867ceb52c4f1db45c80309d91dd (patch)
tree20caeebbd546b3a5a831445a39399c53f2051e24
parentb0e0c5aaabd393ca633c9c1e5d24d15d47e05bec (diff)
downloadseaweedfs-6fb3ec968d64e867ceb52c4f1db45c80309d91dd.tar.xz
seaweedfs-6fb3ec968d64e867ceb52c4f1db45c80309d91dd.zip
s3: allow -s3.config and -s3.iam.config to work together (#7727)
When both -s3.config and -s3.iam.config are configured, traditional credentials from -s3.config were failing with Access Denied because the authorization code always used IAM authorization when IAM integration was configured. The fix checks if the identity has legacy Actions (from -s3.config). If so, use the legacy canDo() authorization. Only use IAM authorization for JWT/STS identities that don't have legacy Actions. This allows both configuration options to coexist: - Traditional credentials use legacy authorization - JWT/STS credentials use IAM authorization Fixes #7720
-rw-r--r--weed/s3api/auth_credentials.go16
1 files changed, 8 insertions, 8 deletions
diff --git a/weed/s3api/auth_credentials.go b/weed/s3api/auth_credentials.go
index eab237b0b..7b5d9a262 100644
--- a/weed/s3api/auth_credentials.go
+++ b/weed/s3api/auth_credentials.go
@@ -610,19 +610,19 @@ func (iam *IdentityAccessManagement) authRequest(r *http.Request, action Action)
}
// Only check IAM if bucket policy didn't explicitly allow
- // This ensures bucket policies can independently grant access (AWS semantics)
if !policyAllows {
- // Use enhanced IAM authorization if available, otherwise fall back to legacy authorization
- if iam.iamIntegration != nil {
- // Always use IAM when available for unified authorization
+ // Traditional identities (with Actions from -s3.config) use legacy auth,
+ // JWT/STS identities (no Actions) use IAM authorization
+ if len(identity.Actions) > 0 {
+ if !identity.canDo(action, bucket, object) {
+ return identity, s3err.ErrAccessDenied
+ }
+ } else if iam.iamIntegration != nil {
if errCode := iam.authorizeWithIAM(r, identity, action, bucket, object); errCode != s3err.ErrNone {
return identity, errCode
}
} else {
- // Fall back to existing authorization when IAM is not configured
- if !identity.canDo(action, bucket, object) {
- return identity, s3err.ErrAccessDenied
- }
+ return identity, s3err.ErrAccessDenied
}
}
}