Skip to content

Commit 57e7690

Browse files
authored
Merge branch 'master' into feature/custom-ring-shard-hc-func
2 parents f5f9d6b + c935f96 commit 57e7690

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

63 files changed

+2491
-256
lines changed

.github/actions/run-tests/action.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ runs:
2525
2626
# Mapping of redis version to redis testing containers
2727
declare -A redis_version_mapping=(
28-
["8.0-RC1"]="8.0-RC1-pre"
28+
["8.0.1"]="8.0.1-pre"
2929
["7.4.2"]="rs-7.4.0-v2"
3030
["7.2.7"]="rs-7.2.0-v14"
3131
)

.github/wordlist.txt

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,4 +65,12 @@ RedisGears
6565
RedisTimeseries
6666
RediSearch
6767
RawResult
68-
RawVal
68+
RawVal
69+
entra
70+
EntraID
71+
Entra
72+
OAuth
73+
Azure
74+
StreamingCredentialsProvider
75+
oauth
76+
entraid

.github/workflows/build.yml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@ name: Go
22

33
on:
44
push:
5-
branches: [master, v9, v9.7]
5+
branches: [master, v9, v9.7, v9.8]
66
pull_request:
7-
branches: [master, v9, v9.7]
7+
branches: [master, v9, v9.7, v9.8]
88

99
permissions:
1010
contents: read
@@ -18,7 +18,7 @@ jobs:
1818
fail-fast: false
1919
matrix:
2020
redis-version:
21-
- "8.0-RC1" # 8.0 RC1
21+
- "8.0.1" # 8.0.1
2222
- "7.4.2" # should use redis stack 7.4
2323
go-version:
2424
- "1.23.x"
@@ -43,7 +43,7 @@ jobs:
4343
4444
# Mapping of redis version to redis testing containers
4545
declare -A redis_version_mapping=(
46-
["8.0-RC1"]="8.0-RC1-pre"
46+
["8.0.1"]="8.0.1-pre"
4747
["7.4.2"]="rs-7.4.0-v2"
4848
)
4949
if [[ -v redis_version_mapping[$REDIS_VERSION] ]]; then
@@ -72,7 +72,7 @@ jobs:
7272
fail-fast: false
7373
matrix:
7474
redis-version:
75-
- "8.0-RC1" # 8.0 RC1
75+
- "8.0.1" # 8.0.1
7676
- "7.4.2" # should use redis stack 7.4
7777
- "7.2.7" # should redis stack 7.2
7878
go-version:

.github/workflows/codeql-analysis.yml

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,9 @@ name: "CodeQL"
1313

1414
on:
1515
push:
16-
branches: [ master ]
16+
branches: [master, v9, v9.7, v9.8]
1717
pull_request:
18-
# The branches below must be a subset of the branches above
19-
branches: [ master ]
18+
branches: [master, v9, v9.7, v9.8]
2019

2120
jobs:
2221
analyze:

.github/workflows/golangci-lint.yml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ on:
88
- master
99
- main
1010
- v9
11+
- v9.8
1112
pull_request:
1213

1314
permissions:
@@ -21,7 +22,7 @@ jobs:
2122
steps:
2223
- uses: actions/checkout@v4
2324
- name: golangci-lint
24-
uses: golangci/golangci-lint-action@v6.5.2
25+
uses: golangci/golangci-lint-action@v8.0.0
2526
with:
26-
verify: false # disable verifying the configuration since golangci is currently introducing breaking changes in the configuration
27+
verify: true
2728

.github/workflows/spellcheck.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ jobs:
88
- name: Checkout
99
uses: actions/checkout@v4
1010
- name: Check Spelling
11-
uses: rojopolis/spellcheck-github-actions@0.48.0
11+
uses: rojopolis/spellcheck-github-actions@0.49.0
1212
with:
1313
config_path: .github/spellcheck-settings.yml
1414
task_name: Markdown

.github/workflows/test-redis-enterprise.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ name: RE Tests
22

33
on:
44
push:
5-
branches: [master]
5+
branches: [master, v9, v9.7, v9.8]
66
pull_request:
77

88
permissions:

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,5 @@ testdata/*
77
redis8tests.sh
88
coverage.txt
99
**/coverage.txt
10-
.vscode
10+
.vscode
11+
tmp/*

.golangci.yml

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,34 @@
1+
version: "2"
12
run:
23
timeout: 5m
34
tests: false
5+
linters:
6+
settings:
7+
staticcheck:
8+
checks:
9+
- all
10+
# Incorrect or missing package comment.
11+
# https://staticcheck.dev/docs/checks/#ST1000
12+
- -ST1000
13+
# Omit embedded fields from selector expression.
14+
# https://staticcheck.dev/docs/checks/#QF1008
15+
- -QF1008
16+
- -ST1003
17+
exclusions:
18+
generated: lax
19+
presets:
20+
- comments
21+
- common-false-positives
22+
- legacy
23+
- std-error-handling
24+
paths:
25+
- third_party$
26+
- builtin$
27+
- examples$
28+
formatters:
29+
exclusions:
30+
generated: lax
31+
paths:
32+
- third_party$
33+
- builtin$
34+
- examples$

README.md

Lines changed: 113 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ key value NoSQL database that uses RocksDB as storage engine and is compatible w
6868

6969
- Redis commands except QUIT and SYNC.
7070
- Automatic connection pooling.
71+
- [StreamingCredentialsProvider (e.g. entra id, oauth)](#1-streaming-credentials-provider-highest-priority) (experimental)
7172
- [Pub/Sub](https://redis.uptrace.dev/guide/go-redis-pubsub.html).
7273
- [Pipelines and transactions](https://redis.uptrace.dev/guide/go-redis-pipelines.html).
7374
- [Scripting](https://redis.uptrace.dev/guide/lua-scripting.html).
@@ -136,17 +137,121 @@ func ExampleClient() {
136137
}
137138
```
138139

139-
The above can be modified to specify the version of the RESP protocol by adding the `protocol`
140-
option to the `Options` struct:
140+
### Authentication
141+
142+
The Redis client supports multiple ways to provide authentication credentials, with a clear priority order. Here are the available options:
143+
144+
#### 1. Streaming Credentials Provider (Highest Priority) - Experimental feature
145+
146+
The streaming credentials provider allows for dynamic credential updates during the connection lifetime. This is particularly useful for managed identity services and token-based authentication.
141147

142148
```go
143-
rdb := redis.NewClient(&redis.Options{
144-
Addr: "localhost:6379",
145-
Password: "", // no password set
146-
DB: 0, // use default DB
147-
Protocol: 3, // specify 2 for RESP 2 or 3 for RESP 3
148-
})
149+
type StreamingCredentialsProvider interface {
150+
Subscribe(listener CredentialsListener) (Credentials, UnsubscribeFunc, error)
151+
}
152+
153+
type CredentialsListener interface {
154+
OnNext(credentials Credentials) // Called when credentials are updated
155+
OnError(err error) // Called when an error occurs
156+
}
157+
158+
type Credentials interface {
159+
BasicAuth() (username string, password string)
160+
RawCredentials() string
161+
}
162+
```
163+
164+
Example usage:
165+
```go
166+
rdb := redis.NewClient(&redis.Options{
167+
Addr: "localhost:6379",
168+
StreamingCredentialsProvider: &MyCredentialsProvider{},
169+
})
170+
```
171+
172+
**Note:** The streaming credentials provider can be used with [go-redis-entraid](https://github.com/redis/go-redis-entraid) to enable Entra ID (formerly Azure AD) authentication. This allows for seamless integration with Azure's managed identity services and token-based authentication.
173+
174+
Example with Entra ID:
175+
```go
176+
import (
177+
"github.com/redis/go-redis/v9"
178+
"github.com/redis/go-redis-entraid"
179+
)
180+
181+
// Create an Entra ID credentials provider
182+
provider := entraid.NewDefaultAzureIdentityProvider()
183+
184+
// Configure Redis client with Entra ID authentication
185+
rdb := redis.NewClient(&redis.Options{
186+
Addr: "your-redis-server.redis.cache.windows.net:6380",
187+
StreamingCredentialsProvider: provider,
188+
TLSConfig: &tls.Config{
189+
MinVersion: tls.VersionTLS12,
190+
},
191+
})
192+
```
149193

194+
#### 2. Context-based Credentials Provider
195+
196+
The context-based provider allows credentials to be determined at the time of each operation, using the context.
197+
198+
```go
199+
rdb := redis.NewClient(&redis.Options{
200+
Addr: "localhost:6379",
201+
CredentialsProviderContext: func(ctx context.Context) (string, string, error) {
202+
// Return username, password, and any error
203+
return "user", "pass", nil
204+
},
205+
})
206+
```
207+
208+
#### 3. Regular Credentials Provider
209+
210+
A simple function-based provider that returns static credentials.
211+
212+
```go
213+
rdb := redis.NewClient(&redis.Options{
214+
Addr: "localhost:6379",
215+
CredentialsProvider: func() (string, string) {
216+
// Return username and password
217+
return "user", "pass"
218+
},
219+
})
220+
```
221+
222+
#### 4. Username/Password Fields (Lowest Priority)
223+
224+
The most basic way to provide credentials is through the `Username` and `Password` fields in the options.
225+
226+
```go
227+
rdb := redis.NewClient(&redis.Options{
228+
Addr: "localhost:6379",
229+
Username: "user",
230+
Password: "pass",
231+
})
232+
```
233+
234+
#### Priority Order
235+
236+
The client will use credentials in the following priority order:
237+
1. Streaming Credentials Provider (if set)
238+
2. Context-based Credentials Provider (if set)
239+
3. Regular Credentials Provider (if set)
240+
4. Username/Password fields (if set)
241+
242+
If none of these are set, the client will attempt to connect without authentication.
243+
244+
### Protocol Version
245+
246+
The client supports both RESP2 and RESP3 protocols. You can specify the protocol version in the options:
247+
248+
```go
249+
rdb := redis.NewClient(&redis.Options{
250+
Addr: "localhost:6379",
251+
Password: "", // no password set
252+
DB: 0, // use default DB
253+
Protocol: 3, // specify 2 for RESP 2 or 3 for RESP 3
254+
})
150255
```
151256

152257
### Connecting via a redis url

0 commit comments

Comments
 (0)