1
0
mirror of https://github.com/redis/go-redis.git synced 2025-11-10 00:00:57 +03:00

feat(acl): add acl support and test (#3576)

* feat: add acl support and command test

* validate client name before kill it

---------

Co-authored-by: Nedyalko Dyakov <1547186+ndyakov@users.noreply.github.com>
This commit is contained in:
destinyoooo
2025-11-05 00:19:09 +08:00
committed by GitHub
parent 71bb3cae4f
commit e2f6700d79
3 changed files with 60 additions and 0 deletions

View File

@@ -8,8 +8,12 @@ type ACLCmdable interface {
ACLLog(ctx context.Context, count int64) *ACLLogCmd
ACLLogReset(ctx context.Context) *StatusCmd
ACLGenPass(ctx context.Context, bit int) *StringCmd
ACLSetUser(ctx context.Context, username string, rules ...string) *StatusCmd
ACLDelUser(ctx context.Context, username string) *IntCmd
ACLUsers(ctx context.Context) *StringSliceCmd
ACLWhoAmI(ctx context.Context) *StringCmd
ACLList(ctx context.Context) *StringSliceCmd
ACLCat(ctx context.Context) *StringSliceCmd
@@ -65,6 +69,24 @@ func (c cmdable) ACLSetUser(ctx context.Context, username string, rules ...strin
return cmd
}
func (c cmdable) ACLGenPass(ctx context.Context, bit int) *StringCmd {
cmd := NewStringCmd(ctx, "acl", "genpass")
_ = c(ctx, cmd)
return cmd
}
func (c cmdable) ACLUsers(ctx context.Context) *StringSliceCmd {
cmd := NewStringSliceCmd(ctx, "acl", "users")
_ = c(ctx, cmd)
return cmd
}
func (c cmdable) ACLWhoAmI(ctx context.Context) *StringCmd {
cmd := NewStringCmd(ctx, "acl", "whoami")
_ = c(ctx, cmd)
return cmd
}
func (c cmdable) ACLList(ctx context.Context) *StringSliceCmd {
cmd := NewStringSliceCmd(ctx, "acl", "list")
_ = c(ctx, cmd)

View File

@@ -92,6 +92,21 @@ var _ = Describe("ACL user commands", Label("NonRedisEnterprise"), func() {
Expect(err).NotTo(HaveOccurred())
Expect(res).To(HaveLen(1))
Expect(res[0]).To(ContainSubstring("default"))
res, err = client.ACLUsers(ctx).Result()
Expect(err).NotTo(HaveOccurred())
Expect(res).To(HaveLen(1))
Expect(res[0]).To(Equal("default"))
res1, err := client.ACLWhoAmI(ctx).Result()
Expect(err).NotTo(HaveOccurred())
Expect(res1).To(Equal("default"))
})
It("gen password", func() {
password, err := client.ACLGenPass(ctx, 0).Result()
Expect(err).NotTo(HaveOccurred())
Expect(password).NotTo(BeEmpty())
})
It("setuser and deluser", func() {

View File

@@ -199,6 +199,29 @@ var _ = Describe("Commands", func() {
Expect(r.Val()).To(Equal(int64(0)))
})
It("should ClientKillByFilter with kill myself", func() {
opt := redisOptions()
opt.ClientName = "killmyid"
db := redis.NewClient(opt)
Expect(db.Ping(ctx).Err()).NotTo(HaveOccurred())
defer func() {
Expect(db.Close()).NotTo(HaveOccurred())
}()
val, err := client.ClientList(ctx).Result()
Expect(err).NotTo(HaveOccurred())
Expect(val).Should(ContainSubstring("name=killmyid"))
myid := db.ClientID(ctx).Val()
killed := client.ClientKillByFilter(ctx, "ID", strconv.FormatInt(myid, 10))
Expect(killed.Err()).NotTo(HaveOccurred())
Expect(killed.Val()).To(BeNumerically("==", 1))
val, err = client.ClientList(ctx).Result()
Expect(err).NotTo(HaveOccurred())
Expect(val).ShouldNot(ContainSubstring("name=killmyid"))
})
It("should ClientKillByFilter with MAXAGE", Label("NonRedisEnterprise"), func() {
SkipBeforeRedisVersion(7.4, "doesn't work with older redis stack images")
var s []string