Skip to content

Commit de96075

Browse files
committed
add namespace support
1 parent e2240e5 commit de96075

File tree

3 files changed

+41
-20
lines changed

3 files changed

+41
-20
lines changed

options.go

+4-1
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ type Options struct {
6767
// TLS Config to use. When set TLS will be negotiated.
6868
TLSConfig *tls.Config
6969

70-
//KeyNamespace used for prefixing/namespacing keys.
70+
// KeyNamespace used for prefixing/namespacing keys.
7171
KeyNamespace string
7272
}
7373

@@ -128,6 +128,9 @@ type ClusterOptions struct {
128128
PoolTimeout time.Duration
129129
IdleTimeout time.Duration
130130
IdleCheckFrequency time.Duration
131+
132+
// KeyNamespace used for prefixing/namespacing keys.
133+
KeyNamespace string
131134
}
132135

133136
func (o *ClusterOptions) redisClusterOptions() *redis.ClusterOptions {

redis.go

+32-13
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package redis
22

33
import (
4+
"fmt"
45
"time"
56

67
"github.com/go-redis/redis"
@@ -21,29 +22,39 @@ func NewRedisStore(opts *Options) *TokenStore {
2122
if opts == nil {
2223
panic("options cannot be nil")
2324
}
24-
return NewRedisStoreWithCli(redis.NewClient(opts.redisOptions()))
25+
return NewRedisStoreWithCli(redis.NewClient(opts.redisOptions()), opts.KeyNamespace)
2526
}
2627

2728
// NewRedisStoreWithCli create an instance of a redis store
28-
func NewRedisStoreWithCli(cli *redis.Client) *TokenStore {
29-
return &TokenStore{
29+
func NewRedisStoreWithCli(cli *redis.Client, keyNamespace ...string) *TokenStore {
30+
store := &TokenStore{
3031
cli: cli,
3132
}
33+
34+
if len(keyNamespace) > 0 {
35+
store.ns = keyNamespace[0]
36+
}
37+
return store
3238
}
3339

3440
// NewRedisClusterStore create an instance of a redis cluster store
3541
func NewRedisClusterStore(opts *ClusterOptions) *TokenStore {
3642
if opts == nil {
3743
panic("options cannot be nil")
3844
}
39-
return NewRedisClusterStoreWithCli(redis.NewClusterClient(opts.redisClusterOptions()))
45+
return NewRedisClusterStoreWithCli(redis.NewClusterClient(opts.redisClusterOptions()), opts.KeyNamespace)
4046
}
4147

4248
// NewRedisClusterStoreWithCli create an instance of a redis cluster store
43-
func NewRedisClusterStoreWithCli(cli *redis.ClusterClient) *TokenStore {
44-
return &TokenStore{
49+
func NewRedisClusterStoreWithCli(cli *redis.ClusterClient, keyNamespace ...string) *TokenStore {
50+
store := &TokenStore{
4551
cli: cli,
4652
}
53+
54+
if len(keyNamespace) > 0 {
55+
store.ns = keyNamespace[0]
56+
}
57+
return store
4758
}
4859

4960
type clienter interface {
@@ -56,13 +67,18 @@ type clienter interface {
5667
// TokenStore redis token store
5768
type TokenStore struct {
5869
cli clienter
70+
ns string
5971
}
6072

6173
// Close close the store
6274
func (s *TokenStore) Close() error {
6375
return s.cli.Close()
6476
}
6577

78+
func (s *TokenStore) wrapperKey(key string) string {
79+
return fmt.Sprintf("%s%s", s.ns, key)
80+
}
81+
6682
// Create Create and store the new token information
6783
func (s *TokenStore) Create(info oauth2.TokenInfo) (err error) {
6884
ct := time.Now()
@@ -73,7 +89,7 @@ func (s *TokenStore) Create(info oauth2.TokenInfo) (err error) {
7389

7490
pipe := s.cli.TxPipeline()
7591
if code := info.GetCode(); code != "" {
76-
pipe.Set(code, jv, info.GetCodeExpiresIn())
92+
pipe.Set(s.wrapperKey(code), jv, info.GetCodeExpiresIn())
7793
} else {
7894
basicID := uuid.Must(uuid.NewRandom()).String()
7995
aexp := info.GetAccessExpiresIn()
@@ -84,11 +100,11 @@ func (s *TokenStore) Create(info oauth2.TokenInfo) (err error) {
84100
if aexp.Seconds() > rexp.Seconds() {
85101
aexp = rexp
86102
}
87-
pipe.Set(refresh, basicID, rexp)
103+
pipe.Set(s.wrapperKey(refresh), basicID, rexp)
88104
}
89105

90-
pipe.Set(info.GetAccess(), basicID, aexp)
91-
pipe.Set(basicID, jv, rexp)
106+
pipe.Set(s.wrapperKey(info.GetAccess()), basicID, aexp)
107+
pipe.Set(s.wrapperKey(basicID), jv, rexp)
92108
}
93109

94110
if _, verr := pipe.Exec(); verr != nil {
@@ -99,7 +115,7 @@ func (s *TokenStore) Create(info oauth2.TokenInfo) (err error) {
99115

100116
// remove
101117
func (s *TokenStore) remove(key string) (err error) {
102-
_, verr := s.cli.Del(key).Result()
118+
_, verr := s.cli.Del(s.wrapperKey(key)).Result()
103119
if verr != redis.Nil {
104120
err = verr
105121
}
@@ -125,29 +141,32 @@ func (s *TokenStore) RemoveByRefresh(refresh string) (err error) {
125141
}
126142

127143
func (s *TokenStore) getData(key string) (ti oauth2.TokenInfo, err error) {
128-
result := s.cli.Get(key)
144+
result := s.cli.Get(s.wrapperKey(key))
129145
if verr := result.Err(); verr != nil {
130146
if verr == redis.Nil {
131147
return
132148
}
133149
err = verr
134150
return
135151
}
152+
136153
iv, err := result.Bytes()
137154
if err != nil {
138155
return
139156
}
157+
140158
var tm models.Token
141159
if verr := jsonUnmarshal(iv, &tm); verr != nil {
142160
err = verr
143161
return
144162
}
163+
145164
ti = &tm
146165
return
147166
}
148167

149168
func (s *TokenStore) getBasicID(token string) (basicID string, err error) {
150-
tv, verr := s.cli.Get(token).Result()
169+
tv, verr := s.cli.Get(s.wrapperKey(token)).Result()
151170
if verr != nil {
152171
if verr == redis.Nil {
153172
return

redis_test.go

+5-6
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,7 @@ func TestTokenStore(t *testing.T) {
2121
Addr: addr,
2222
DB: db,
2323
}
24-
store, err := redis.NewRedisStore(opts)
25-
So(err, ShouldBeNil)
24+
store := redis.NewRedisStore(opts)
2625

2726
Convey("Test authorization code store", func() {
2827
info := &models.Token{
@@ -106,12 +105,12 @@ func TestTokenStore(t *testing.T) {
106105

107106
func TestTokenStoreWithKeyNamespace(t *testing.T) {
108107
Convey("Test redis token store", t, func() {
109-
cfg := &redis.Config{
110-
Addr: "127.0.0.1:6379",
108+
opts := &redis.Options{
109+
Addr: addr,
110+
DB: db,
111111
KeyNamespace: "test:",
112112
}
113-
store, err := redis.NewTokenStore(cfg)
114-
So(err, ShouldBeNil)
113+
store := redis.NewRedisStore(opts)
115114

116115
Convey("Test authorization code store", func() {
117116
info := &models.Token{

0 commit comments

Comments
 (0)